Tôi đang thiết kế cơ sở dữ liệu này phải duy trì lịch sử tiền lương của nhân viên và các chuyển động trong tổ chức. Về cơ bản, thiết kế của tôi có 3 bảng (ý tôi là, có nhiều bảng hơn nhưng đối với câu hỏi này tôi sẽ đề cập đến 3, vì vậy hãy chịu đựng với tôi). Bảng nhân viên (có lương cao nhất, dữ liệu vị trí, vv), bảng lương (lương, ngày, lý do, vv) và MovementHistory (Title, Dept., comments). Tôi sẽ sử dụng LINQ để Sql, vì vậy những gì tôi đã suy nghĩ là mỗi khi nhân viên dữ liệu được cập nhật, các giá trị cũ sẽ được sao chép vào bảng lịch sử tương ứng của họ. Đây có phải là cách tiếp cận tốt không? Tôi có nên làm điều đó bằng cách sử dụng LINQ to SQL hoặc trình kích hoạt không? Cảm ơn bạn đã giúp đỡ, gợi ý hoặc ý tưởng.duy trì lịch sử trong cơ sở dữ liệu
Trả lời
Hãy xem http://www.simple-talk.com/sql/database-administration/database-design-a-point-in-time-architecture.
Về cơ bản, bài viết cho thấy rằng bạn có các cột sau trong bảng bạn cần phải theo dõi lịch sử -
* DateCreated – the actual date on which the given row was inserted.
* DateEffective – the date on which the given row became effective.
* DateEnd – the date on which the given row ceased to be effective.
* DateReplaced – the date on which the given row was replaced by another row.
* OperatorCode – the unique identifier of the person (or system) that created the row.
DateEffective và DateEnd cùng cho bạn biết thời gian mà hàng là hợp lệ (hoặc thời gian mà một nhân viên ở trong một bộ phận, hoặc thời gian mà anh ta kiếm được một mức lương cụ thể).
Bạn nên giữ logic đó bên trong cơ sở dữ liệu: đó là lý do tại sao trình kích hoạt tồn tại. Tôi nói điều này một cách cẩn thận, tuy nhiên, vì có rất nhiều lý do để giữ nó bên ngoài. Thông thường, đặc biệt là với một công nghệ dễ dàng như LINQ-to-SQL - nó dễ dàng hơn để viết mã bên ngoài. Theo kinh nghiệm của tôi, nhiều người hơn có thể viết rằng logic trong C#/LINQ hơn có thể làm điều đó một cách chính xác bằng cách sử dụng một kích hoạt.
Trình kích hoạt nhanh - chúng được biên dịch! Tuy nhiên, chúng rất dễ bị lạm dụng và làm cho logic của bạn quá phức tạp đến mức độ hiệu suất có thể giảm đi nhanh chóng. Xem xét trường hợp sử dụng của bạn đơn giản như thế nào, Tôi sẽ chọn sử dụng trình kích hoạt, nhưng đó là cá nhân tôi.
Cảm ơn thông tin chi tiết của bạn :) – jasonco
Tôi nghĩ đây là phương pháp tôi sẽ sử dụng. Tôi không có nhiều kinh nghiệm với trình kích hoạt. Tôi có nghĩa là, tôi vẫn đang học LINQ to sql nhưng tôi cảm thấy thoải mái hơn nhiều. – jasonco
Tôi không đồng ý với nhận xét "ý tưởng hay" nhưng không đồng ý theo cách bạn nghĩ. Các quy tắc này nên * luôn luôn * nằm trong cơ sở dữ liệu để đảm bảo rằng các máy khách cơ sở dữ liệu tuân theo chúng. DB phải là một thực thể cho chính nó, bảo vệ tính toàn vẹn dữ liệu của riêng nó, không dựa vào các bên bên ngoài. +1 anyway. – paxdiablo
Trình kích hoạt có thể sẽ nhanh hơn và không yêu cầu "người trung gian" để hoàn thành công việc, loại bỏ ít nhất một cơ hội bị lỗi.
Tùy thuộc vào cơ sở dữ liệu bạn chọn, bạn chỉ có thể sử dụng một bảng và bật OID trên bảng và thêm hai cột nữa, "gắn cờ" và "trước đó". Không bao giờ cập nhật bảng này, chỉ chèn. Thêm một trình kích hoạt để khi một hàng được thêm vào cho nhân viên #id, hãy đặt tất cả các bản ghi với nhân viên #id để có một lá cờ "cũ" và đặt hàng mới "trước đó" giá trị cho hàng trước đó.
Cảm ơn bạn đã bình luận! – jasonco
Trình kích hoạt giúp cho giao diện người dùng của bạn dễ dàng di chuyển sang một thứ khác và chúng sẽ giữ cho cơ sở dữ liệu nhất quán bất kể dữ liệu được chèn/cập nhật/bị xóa như thế nào.
Bên cạnh trường hợp của bạn, tôi sẽ viết tiền lương thẳng vào lịch sử tiền lương - từ mô tả của bạn, tôi sẽ không thấy lý do tại sao bạn nên đi qua một cập nhật kích hoạt trên bảng nhân viên.
Đó là cách tôi đã có nó đầu tiên nhưng quyết định sử dụng bảng lịch sử chỉ cho lịch sử, không có gì hiện tại. Ý tôi là, tôi chắc chắn có rất nhiều cách để làm điều đó Tôi chỉ là loại mắc kẹt tìm kiếm các giải pháp đúng và không có giải pháp đúng! hehe cảm ơn cho bình luận của bạn. – jasonco
Tôi nghĩ điều này thuộc về cơ sở dữ liệu vì hai lý do.
Đầu tiên, tầng giữa đi và đến, nhưng cơ sở dữ liệu là mãi mãi. Năm nay Java EJBs, năm tới .NET, năm sau đó một cái gì đó khác. Dữ liệu vẫn còn, theo kinh nghiệm của tôi.
Thứ hai, nếu cơ sở dữ liệu được chia sẻ thì không cần phải dựa vào mọi ứng dụng sử dụng nó để biết cách duy trì tính toàn vẹn dữ liệu của nó. Tôi sẽ xem xét đây là một ví dụ về đóng gói của cơ sở dữ liệu. Tại sao buộc kiến thức và bảo trì lịch sử trên mọi khách hàng?
Cảm ơn, tôi cũng sẽ xem xét điều này. – jasonco
- 1. Cơ sở dữ liệu Lịch sử
- 2. quản lý hàng lịch sử trong cơ sở dữ liệu
- 3. Duy trì tính duy nhất của một thuộc tính trong cơ sở dữ liệu NDB
- 4. Làm thế nào để duy trì một EnumSet (sử dụng hai bảng cơ sở dữ liệu)?
- 5. Duy trì trạng thái trong máy chủ ứng dụng hoặc trong cơ sở dữ liệu?
- 6. Duy trì tính toàn vẹn của lớp con trong cơ sở dữ liệu quan hệ
- 7. Cách duy trì kết nối cơ sở dữ liệu trong máy chủ web python
- 8. Làm thế nào để duy trì cấu trúc dữ liệu biểu đồ trong cơ sở dữ liệu quan hệ?
- 9. Thiết kế cơ sở dữ liệu: cách theo dõi lịch sử?
- 10. Cách duy trì lịch sử công việc bằng cách sử dụng Lịch hẹn Quartz
- 11. Cấu trúc cơ sở dữ liệu để lưu trữ dữ liệu lịch sử
- 12. Làm cách nào để thiết kế cơ sở dữ liệu với Lịch sử sửa đổi?
- 13. Làm thế nào để duy trì kết nối cơ sở dữ liệu trong ứng dụng ASP.NET MVC?
- 14. Một cơ sở dữ liệu người dùng phục vụ nhiều cơ sở dữ liệu ứng dụng
- 15. từ cơ sở dữ liệu sử dụng?
- 16. mangento trong cơ sở dữ liệu hoặc cơ sở oracle?
- 17. Nhiều cơ sở dữ liệu trong Rails
- 18. Cách sử dụng nhiều cơ sở dữ liệu trong ứng dụng Rails Sử dụng cơ sở dữ liệu
- 19. Giao dịch trong cơ sở dữ liệu wordpress
- 20. Thiết kế cơ sở dữ liệu với Lịch sử thay đổi
- 21. Cấu trúc cơ sở dữ liệu để theo dõi lịch sử thay đổi
- 22. Một cơ sở dữ liệu và nhiều cơ sở dữ liệu
- 23. Làm thế nào để sao chép cơ sở dữ liệu trong sử dụng cơ sở dữ liệu khác trong django?
- 24. Chuyển dữ liệu từ cơ sở dữ liệu này sang cơ sở dữ liệu khác
- 25. Di chuyển cơ sở dữ liệu An toàn nguồn sang SubVersion bằng lịch sử
- 26. Kết hợp nhiều cơ sở dữ liệu vào một cơ sở dữ liệu đơn
- 27. Lặp lại "sự kiện" trong lịch: CPU và Cơ sở dữ liệu
- 28. Sự khác nhau giữa cơ sở dữ liệu thời gian và cơ sở dữ liệu lưu trữ lịch sử là gì?
- 29. An toàn để sử dụng System.currentTimeMillis() để tạo một ID cơ sở dữ liệu duy nhất?
- 30. FluentValidation xác nhận tên duy nhất bằng cách sử dụng cơ sở dữ liệu
Thú vị liên kết - đọc tốt, cảm ơn! – ChristopheD
Thật tuyệt, tôi đã có một sự tương tự về những ngày tháng. Cảm ơn bài đăng của bạn, rất hữu ích! – jasonco