Liệu nó có ý nghĩa để chuẩn hóa bao gồm một ngày được tạo và trường ngày cập nhật mới nhất trên tất cả các bảng DB?


38

Sếp của tôi hiện đang cố gắng áp dụng một số tiêu chuẩn phát triển cho nhóm của chúng tôi, vì vậy chúng tôi đã có một cuộc họp ngày hôm qua để thảo luận về các tiêu chuẩn chủ yếu diễn ra tốt đẹp cho đến khi cô ấy đưa ra:

  • Tất cả các bảng DB sẽ có cột createdDate và LastUpdatedDate, được cập nhật bởi các trình kích hoạt.

Tại thời điểm này, nhóm của chúng tôi đã chịu một sự phân ly ý kiến; một nửa trong số chúng tôi nghĩ rằng làm điều này trên tất cả các bảng là một lượng lớn công việc với rất ít lợi ích (chúng tôi làm việc trong các dự án ngân sách cố định nên mọi chi phí đều đến từ lợi nhuận của công ty chúng tôi); nửa thứ hai tin rằng nó sẽ giúp với sự hỗ trợ của các dự án.

Tôi vững vàng trong trại cũ. Mặc dù tôi đánh giá cao rằng một số trường hợp bên ngoài sẽ khiến các cột bổ sung cải thiện khả năng hỗ trợ, nhưng theo tôi, khối lượng công việc sẽ được yêu cầu để thêm các cột ở vị trí đầu tiên, cũng như bảo trì, sẽ khiến chúng tôi mất ít thời gian hơn những thứ quan trọng như Đơn vị- hoặc Kiểm tra tải. Ngoài ra, tôi khá chắc chắn rằng các cột bổ sung này sẽ khiến việc sử dụng ORM trở nên khó xử hơn khi chúng ta chủ yếu sử dụng C # và Oracle, điều này không vui lắm khi bắt đầu.

Vì vậy, câu hỏi của tôi là gấp đôi:

  • Tôi có ở đúng trại không? Tôi không khẳng định có kỹ năng cơ sở dữ liệu nổi tiếng thế giới, vì vậy đây có thể là một bổ sung dễ dàng không có tác dụng phụ.
  • Làm thế nào bạn sẽ đối phó với một tình huống trong đó một cuộc họp về các tiêu chuẩn phá hủy thành một trận đấu xỉ? Làm thế nào tôi thực sự có thể bán rằng tiêu chuẩn này sẽ không giúp chúng tôi lâu dài?

Tại sao bạn nói C # không phải là ORM-happy? Ngoài ra, việc thêm các thuộc tính [insert = "false" update = "false" created = "always"] vào ánh xạ của hai cột này trong NHibernate chẳng hạn có vẻ khó xử với tôi hay tôi thiếu thứ gì?
Jalayn

C # + Oracle không phải là ORM-happy, và chúng tôi thấy rằng NHibernate quá nặng (rõ ràng, tôi không tham gia vào cuộc điều tra công cụ đó). Tôi có lẽ đặt C # và Oracle ngược lại trong câu hỏi chính.
Ed James

Bạn nên xem xét việc đổi tên tiêu đề của câu hỏi của bạn để mô tả nhiều hơn về các tiêu chuẩn cơ sở dữ liệu.
maple_shaft

Làm thế nào điều này sẽ mất thời gian từ bất cứ điều gì? Bạn sẽ phải làm điều đó ít nhất hai lần cho 'các trường hợp bên ngoài'. Tạo một công cụ và một số lớp có thể tái sử dụng và không bao giờ lo lắng về nó nữa.
Steven Evers

Câu trả lời:


27

Đây là một thực tế khá phổ biến, mặc dù tôi không nói khả năng hỗ trợ là lợi ích chính. Lợi ích thực sự cho phương pháp này là giữ một dấu vết kiểm toán. Đây cũng là nơi phổ biến để có thêm một cột chứa tên người dùng của người dùng đã thực hiện cập nhật cuối cùng.

Nếu bạn đang xử lý bất kỳ loại dữ liệu tài chính hoặc cảm giác nào, tôi chắc chắn bạn đã nghe nói về những điều như tuân thủ PCI & SOX . Có một lộ trình kiểm toán toàn diện là điều cần thiết để đáp ứng các thông số kỹ thuật đó ..

Tuyên bố miễn trừ trách nhiệm: Tuy nhiên, có nhiều cách tốt hơn để đạt được lộ trình kiểm toán cơ sở dữ liệu> https://stackoverflow.com/questions/1051449/ideas-on-database-design-for-capturing-audit-trails


Xin lỗi, quên đề cập, không tuân thủ PCI (v.v.), đã có quy trình kiểm toán trong nhật ký (MỌI THỨ được ghi lại khá kỹ lưỡng).
Ed James

6
"(MỌI THỨ được ghi lại khá kỹ lưỡng)" có bao gồm createdDate và LastUpdatedDate không? Nếu vậy, có lẽ bạn có thể hướng đồng nghiệp của mình theo nguyên tắc DRY :)
MattDavey

2
Đó là một điểm rất tốt, có lẽ tôi nên thúc đẩy một trình phân tích cú pháp nhật ký hiệu quả hơn mà chúng ta có thể sử dụng để dễ dàng truy vấn dữ liệu lưu trữ (rõ ràng dữ liệu này là dành cho mục đích kiểm toán để chúng tôi không giữ giá trị hơn một tuần truy vấn, phần còn lại được lưu trữ).
Ed James

3
Tôi không nghĩ rằng phương pháp này sẽ mang lại một dấu vết kiểm toán phong phú ... Tôi thậm chí sẽ không gọi nó là một dấu vết kiểm toán .
Jordão

@ Jordão Tôi nói đó là một cách tiếp cận phổ biến, tôi không nói đó là một cách tốt! Do đó từ chối trách nhiệm :)
MattDavey

17

Đối số trước đây không hợp lệ, vì thêm một vài trường dấu thời gian duy trì cơ sở dữ liệu vào một loạt các bảng không phải là công việc khó khăn. Trên thực tế, đây là loại nhiệm vụ gây tê tâm trí mà người ta sẽ giao cho một thiếu niên hoặc thực tập viên, và họ có thể dễ dàng thực hiện nó trong một lần chạy nước rút hai tuần với thời gian rảnh rỗi.

Thậm chí có thể hoặc không cần thiết phải ánh xạ các trường này trong ORM của bạn, đơn giản vì bạn không muốn người dùng ứng dụng sửa đổi các trường này và vì chúng hữu ích cho việc bảo trì và gỡ lỗi và hiếm khi được sử dụng trong logic nghiệp vụ. Tôi đã làm việc trong các cửa hàng đã làm cả hai cách và tôi thực sự không có nhiều ý kiến ​​về cách này.

Những lợi ích, ngay cả khi được sử dụng vẫn vượt xa bất kỳ chi phí nào của con người khi thực hiện chức năng đó ở cấp cơ sở dữ liệu, và chắc chắn có thể ít hơn sức mạnh não bộ của các dự án có đầu óc kỹ thuật tuyệt vời chiếm lĩnh cuộc họp và đưa nó ra trong một trận đấu đập ngực hoành tráng. Khi bạn kiểm tra tác động của một vài cuộc họp kéo dài 1 giờ đối với tuổi thọ của một dự án, bạn có thể sẽ không ngạc nhiên khi chúng đắt đỏ. Hãy tưởng tượng tiền lương tập thể hàng giờ và lợi ích của tất cả những người đó cộng lại và điều đó sẽ cho bạn một ý tưởng.


8
Tạo một tập lệnh sẽ thêm các cột này vào mỗi bảng nếu chúng chưa tồn tại cùng với các trình kích hoạt.
JeffO

3
+1 Bạn có thể mã tạo các tập lệnh dễ dàng trong một vài ngày. Chỉ có rất nhiều công việc nếu nó được thực hiện bằng tay.
Jon Raynor

8

... những câu nói càng dứt khoát của một người đàn ông càng khiến anh ta càng dễ bị sai lầm ... - ông trùm Durden

điều này áp dụng cho "tiêu chuẩn" chăn, trong khi trên một số bàn, đây có thể là một chiến thắng lớn, trên mỗi bàn rất có thể là tiếng ồn vô dụng và nhiều mã hơn để duy trì hoặc quên duy trì.

có một sự cân bằng cần có ở đây, đó là những gì bạn nên thúc đẩy những người ra quyết định.


8

Tôi đồng ý hết lòng. Hầu như mọi bảng trong mọi cơ sở dữ liệu nên có ít nhất 2 trường: ngày tạongày cập nhật . Có nhiều lý do mà bạn nên đặt ngày tạo và ngày cập nhật. Vì những lý do rõ ràng mà những người đi trước đã nêu rõ đó là kiểm toán.

Tôi đã thiết kế hệ thống và cơ sở dữ liệu trong 25 năm và đã làm việc cho hàng trăm khách hàng. Không có một khách hàng nào KHÔNG cần điều này.

Có 2 cách cơ bản để làm điều này:

1 - Thực hành đầu tiên là để cơ sở dữ liệu thực hiện công việc và đưa nó trực tiếp vào thiết kế bảng. Đó là mức tối thiểu, tôi muốn giới thiệu.

2 - Cách thực hành khác, mà tôi thích .... là sử dụng một công cụ sao chép để xử lý việc này. Có rất ít chi phí và không có chi phí cho các đội DEV. Tuy nhiên, các công cụ đắt tiền. Một lợi thế nữa là quá trình xóa có thể được kiểm tra dễ dàng hơn nhiều với loại công cụ này. Nếu không có một công cụ sao chép, bạn sẽ cần phải tạo một bảng kiểm toán và kích hoạt lửa để xóa - theo ý kiến ​​của tôi không phải là một thực hành tốt.

Một lợi ích khác khi có các trường này là kho dữ liệu và ODS LUÔN được xây dựng cho bất kỳ hệ thống OLTP nào. Bạn không thể kéo dữ liệu gia tăng một cách hiệu quả mà không có nó. Nếu không, bạn có nguy cơ phải tải lại toàn bộ DB mỗi ngày.

Có một số lượng lớn các lý do kinh doanh khác để đưa vào 2 ngày này, mà tôi sẽ không đi sâu vào đây. Làm bài tập về nhà của bạn và tôi chắc chắn 3-6-12-48 tháng sau bạn sẽ rất vui khi đặt vào 2 lĩnh vực đơn giản này.

Tôi đã thực hiện và thường đề xuất cả hai giải pháp khi có thể.


5

Chúng tôi có ngày tạo và được tạo bởi các cột trong cơ sở dữ liệu của chúng tôi và chúng đã giúp chúng tôi rất nhiều trong việc theo dõi các vấn đề dữ liệu. Nếu chúng ta cần hoàn nguyên, nó giúp chúng ta tìm ra các bản ghi chính xác trong các bảng kiểm toán đầy đủ (vì chúng ta biết nơi để tìm trong một bảng rất lớn). Cô ấy cũng nên thêm một cái được tạo bởi và sửa đổi bởi các cột quá. Nó thực sự giúp biết được ai đã đưa dữ liệu vào, đặc biệt nếu bạn không kiểm toán đầy đủ.

Tôi có thể nghĩ rằng không có ứng dụng Doanh nghiệp nào không cần kiểm toán dưới hình thức này hay hình thức khác. Rõ ràng ông chủ của bạn nghĩ rằng nó chỉ cần kiểm toán tương đối nhẹ. Cá nhân tôi ủng hộ kiểm toán toàn bộ trên mọi cơ sở dữ liệu chứa dữ liệu mà công ty bạn phụ thuộc vào (việc hoàn nguyên 2000 hồ sơ xấu từ bảng kiểm toán sẽ dễ dàng hơn rất nhiều so với khôi phục sao lưu) và sẽ yêu cầu nếu có bất kỳ thông tin tài chính nào như tôi đã thấy loại điều này giúp bắt người phạm tội lừa đảo. Tất cả kiểm toán phải ở cấp cơ sở dữ liệu.

Làm thế nào dữ liệu này có thể giúp đỡ? Đầu tiên, nó thu hẹp khi nào cần tìm dữ liệu cũ (trong bản sửa đổi) và nó có thể giúp bạn xem phiên bản nào của chương trình của bạn đã hoạt động tại thời điểm dữ liệu được nhập. Vì vậy, nếu bạn biết bạn đã khắc phục sự cố đó trong phiên bản 2.3 xuất hiện vào ngày 6 tháng 7 năm 2011 và sau đó tìm thấy sự cố tương tự với bản ghi được chèn vào ngày 7 tháng 8, thì có lẽ cách khắc phục của bạn không tốt. Nếu bạn cần hoàn nguyên về dữ liệu cũ, nó sẽ cho bạn biết phiên bản sao lưu nào bạn có thể tìm thấy dữ liệu cũ nếu bạn không kiểm tra đầy đủ.

Các nhà phát triển dường như hiếm khi nghĩ rằng dữ liệu phải được duy trì theo thời gian và dữ liệu xấu cần được sửa bởi ai đó. Có những thứ như thế có thể rất có giá trị đối với những người trong chúng ta phải làm những việc như vậy. Sếp của bạn nói đúng, mặc dù tôi không nghĩ cô ấy đã đi đủ xa trong kiểm toán. Chỉ cần một vấn đề thực sự nghiêm trọng là dễ khắc phục để biện minh cho lượng thời gian rất nhỏ cần thiết để thêm các cột và trình kích hoạt này.


Tôi muốn thấy mọi người kiểm tra đơn vị một cách hiệu quả các bản sửa lỗi của họ hơn là cố gắng xác minh chúng bằng kiểm tra DB, nhưng tôi đánh giá cao quan điểm của bạn. Tuy nhiên, tôi không chắc chắn rằng điểm bạn đưa ra sẽ áp dụng cho MỌI bảng trong tất cả các cơ sở dữ liệu của chúng tôi, ngay cả các bảng tham chiếu, v.v.
Ed James

Kiểm tra đơn vị là riêng biệt từ kiểm toán. Tôi đề cập rằng nó có thể bắt lỗi vì tôi đã thấy nó xảy ra ngay cả khi có các bài kiểm tra đơn vị vì có trường hợp cạnh chưa được kiểm tra. Nó cũng có thể chỉ ra dữ liệu đã được nhập trước khi sửa lỗi và sau đó bạn có thể cần phải đi tìm dữ liệu khác cũng cần sửa. Hoặc chỉ biết rằng đó là dữ liệu được nhập thông qua một lần nhập vào ngày 6 tháng 6 năm 2016, điều này sẽ giúp bạn biết liệu vấn đề là việc nhập của bạn đã làm hay có gì đó không đúng với dữ liệu trong tệp nhập. Điều đó dễ dàng hơn nhiều so với việc xem qua các tệp nhập hàng ngày có giá trị trong một năm.
HLGEM

4

Khối lượng công việc không còn nhiều vì điều này có thể được viết kịch bản và áp dụng cho mọi cơ sở dữ liệu bạn sẽ tạo. Thêm các cột vào tất cả các bảng cùng với các kích hoạt. Bạn chỉ cần nhớ để chạy nó với bản dựng của bạn.

Theo như những gì khách hàng muốn, bạn có thể yêu cầu họ trả tiền cho bạn để tích hợp chúng vào ứng dụng của bạn khi họ thấy phù hợp. Nhiều người muốn xem thông tin bổ sung trên một bản ghi như ai đã tạo / thay đổi nó lần cuối và khi nào. Không cần phải gửi cho mọi người một email để tìm hiểu hoặc bị nói dối. Bạn không muốn phải truy vấn nhật ký mỗi khi ai đó xem bản ghi.

Đưa nó vào cơ sở dữ liệu và có nó trong trường hợp không khó và có thể cho phép bạn tính phí cho các tính năng bổ sung sử dụng các trường hoặc chỉ cung cấp cho bạn một số phản hồi về số lượng khách hàng đang sử dụng hệ thống.


Các khách hàng đã không bày tỏ bất kỳ ý kiến ​​nào về chủ đề này (theo như tôi biết) và có lẽ không biết gì về tiêu chuẩn mới của chúng tôi, vì vậy tôi rất mong họ sẽ không quan tâm đến việc trả tiền cho bất kỳ sự tích hợp nào;) Tuy nhiên, điều "có thể cho phép bạn tính phí" là một lý lẽ hợp lý tốt, nếu một chút phụ thuộc vào "có thể" cho cách tiếp cận thông thường của tôi để phát triển.
Ed James

1

Đây sẽ là một việc khá nhỏ để thực hiện (có thể tổng cộng từ 1 đến 3 ngày), vì vậy theo tôi, nó sẽ có giá trị bao nhiêu để thêm vào ứng dụng của bạn trong suốt vòng đời.

Đầu tiên, cần có một câu lệnh bảng thay đổi để thêm các cột, tất cả các bảng thay đổi sẽ giống nhau (ngoại trừ tên bảng), vì vậy bạn có thể viết một tập lệnh để mã tạo ra câu lệnh SQL thay đổi cho tất cả các bảng mà điều này là cần thiết . Phải cho phép các NULL tính toán dữ liệu hiện có và kiểm tra sự tồn tại của các cột để nó có thể chạy lại được.

Thứ hai, đối với các cột, sử dụng các giá trị mặc định, như GetUTCDate () (SQL Server, Oracle có thể khác nhau) sẽ giải quyết mọi bổ sung mã hóa khi chèn, do đó, cơ sở mã không phải thay đổi cho bất kỳ câu lệnh chèn nào vì các giá trị mặc định sẽ là đã sử dụng.

Các cập nhật cho dữ liệu (thay đổi để sửa đổi lần cuối) có thể được giải quyết bằng trình kích hoạt cập nhật. Một lần nữa, trình kích hoạt này sẽ gần giống nhau trên tất cả các bảng, vì vậy mã kích hoạt này (SQL) có thể là mã được tạo cũng như cho bất kỳ bảng hiện có nào.

Có khả năng sẽ có rất nhiều mã script sql (tùy thuộc vào số lượng bảng), nhưng đó là một mẫu có thể lặp lại, vì vậy bạn có thể tạo mã bằng cách xem xét một lược đồ DB hiện có.


Tôi lo lắng rằng với cách tiếp cận băng tần lớn như vậy, bạn sẽ gặp vấn đề về bảo trì dài hạn với các bảng mới hoặc rằng (thậm chí tệ hơn) bạn phải tạo ra một vòng quay quét từng bảng cho các cột được đặt tên nhất định sau đó tạo ra kịch bản DDL để thêm chúng nếu thiếu, nghe có vẻ như một cơn ác mộng bảo trì!
Ed James

Nếu đây là một tiêu chuẩn, hy vọng nhà phát triển tạo các bảng mới tuân theo tiêu chuẩn. Nếu không, vâng, cơn ác mộng. Cách tiếp cận là làm cho lược đồ hiện có tăng tốc, ngay cả khi onus được nhà phát triển tuân theo tiêu chuẩn.
Jon Raynor

Tôi nghĩ từ khóa trong bình luận đó là "hy vọng", tôi không chắc mình tin tưởng bất cứ điều gì xảy ra với ý định của mỗi nhà phát triển mới!
Ed James

2
@Ed - Đồng ý, không tin tưởng, đó là những gì mã đánh giá dành cho! :)
Jon Raynor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.