2008-09-26 30 views
9

Tôi đang làm việc trên các thiết kế cơ sở dữ liệu cho một hệ thống quản lý dự án làm dự án cá nhân và tôi đã bị đánh sập.Cấu trúc cơ sở dữ liệu để theo dõi lịch sử thay đổi

Tôi muốn triển khai hệ thống vé và tôi muốn vé trông giống như tickets in Trac. Tôi sẽ sử dụng cấu trúc nào để nhân rộng hệ thống này? (Tôi chưa cài đặt thành công trac trên bất kỳ hệ thống nào của mình nên tôi thực sự không thể nhìn thấy nó đang làm gì)

Lưu ý: Tôi không thích lưu trữ hoặc hiển thị vé ở bất kỳ phiên bản nào. Tôi chỉ cần một lịch sử thay đổi. Tôi không muốn lưu trữ thêm dữ liệu. Ngoài ra, tôi đã thực hiện một tính năng như thế này bằng cách sử dụng một mảng được tuần tự hóa trong một trường văn bản. Tôi không muốn thực hiện điều đó như một giải pháp một lần nữa.

Chỉnh sửa: Tôi chỉ tìm kiếm cấu trúc cơ sở dữ liệu. Triggers/Callbacks không thực sự là một vấn đề.

Trả lời

15

tôi đã thực hiện tinh khiết Thay đổi dữ liệu ghi lại bằng cách sử dụng "mỏng" thiết kế:

RecordID Table Column OldValue NewValue 
-------- ----- ------ -------- -------- 

Bạn không thể muốn sử dụng "Bảng" và "Cột", mà là "đối tượng" và "tài sản ", v.v., tùy thuộc vào thiết kế của bạn.

Điều này có lợi thế về tính linh hoạt và đơn giản, với chi phí tốc độ truy vấn - chỉ mục nhóm trên cột "Bảng" và cột "" có thể tăng tốc truy vấn và bộ lọc. Nhưng nếu bạn định xem nhật ký thay đổi trực tuyến thường xuyên ở mức Bảng hoặc đối tượng, bạn có thể muốn thiết kế một cái gì đó phẳng hơn.

EDIT: một số người đã chỉ ra đúng rằng với giải pháp này, bạn không thể kéo cùng một tập hợp thay đổi. Tôi đã quên điều này trong bảng bên trên - triển khai mà tôi đã làm việc cũng có bảng "Giao dịch" với thông tin về ngày, người dùng và thông tin khác và cột "TransactionID", do đó thiết kế sẽ trông như sau:

CHANGE LOG TABLE: 
RecordID Table Column OldValue NewValue TransactionID 
-------- ----- ------ -------- -------- ------------- 

TRANSACTION LOG TABLE: 
TransactionID UserID TransactionDate 
------------- ------ --------------- 
+0

Cảm ơn bạn đã trả lời. Vấn đề duy nhất với điều đó là làm cách nào để nhóm các thay đổi thành một bộ thay đổi duy nhất? – epochwolf

+0

Bạn có thể đưa ra một số ví dụ về các truy vấn hoặc mã ứng dụng mà bạn sẽ sử dụng để xây dựng một lịch sử dựa trên bảng thay đổi bản ghi này không? Làm thế nào bạn sẽ kéo lên một phiên bản cụ thể? –

+0

Cảm ơn bạn, điều đó hoạt động :) – epochwolf

1

Tôi muốn nói tạo một số loại lớp học về sự kiện mà bạn ping mỗi khi có sự cố xảy ra trong hệ thống của bạn & mô tả sự kiện trong cơ sở dữ liệu.

Cần lưu trữ thông tin cơ bản về ai/cái gì/ở đâu/khi nào /.

sắp xếp thông qua bảng sự kiện dự án đó sẽ giúp bạn có được thông tin bạn muốn.

+0

Điều đó trông như thế nào là một cấu trúc cơ sở dữ liệu? – epochwolf

3

Bạn có sau cơ chế cơ sở dữ liệu như thế này không?

CREATE OR REPLACE TRIGGER history$yourTable 
     BEFORE UPDATE ON yourTable 
     FOR EACH ROW 
     BEGIN 
      INSERT INTO 
       history 
      VALUES 
       (
       :old.field1, 
       :old.field2, 
       :old.field3, 
       :old.field4, 
       :old.field5, 
       :old.field6 
       ); 
     END; 
    /
    SHOW ERRORS TRIGGER history$yourTable 
+0

Không thực sự. Tôi chỉ xem xét cách lưu trữ dữ liệu. Không phải cách để đưa dữ liệu vào một bảng. – epochwolf

+0

Lấy dữ liệu vào một bảng có chức năng giống như lưu trữ dữ liệu. Vậy bạn đang cố gắng làm gì? –

+0

Tại nơi làm việc, chúng tôi sử dụng một cái gì đó rất giống nhau, chúng tôi sử dụng bảng "lịch sử" để sửa đổi trong mỗi bảng, vì vậy chúng tôi giữ tên của bảng bị ảnh hưởng, PK của hàng bị ảnh hưởng và hoạt động gì (INSERT, DELETE, CẬP NHẬT). Trong bảng phụ có liên quan, tên, giá trị trước đó và giá trị mới của tất cả các cột. –

0

Một giải pháp có thể là lưu trữ một bản sao của vé trong một bảng lịch sử với người dùng đã thực hiện thay đổi.

Tuy nhiên, điều này sẽ lưu trữ nhiều dữ liệu bổ sung và yêu cầu nhiều quá trình xử lý để tạo chế độ xem mà Trac hiển thị.

2

Theo như không lưu trữ nhiều dữ liệu bổ sung, tôi không thể nghĩ ra bất kỳ cách nào tốt để làm điều đó. Bạn phải lưu trữ mọi bản sửa đổi để xem thay đổi.

Đây là một giải pháp mà tôi đã thấy, mặc dù tôi không chắc đó có phải là giải pháp tốt nhất hay không. Có khóa chính, giả sử id trỏ đến một phiên bản cụ thể. cũng có các trường ticket_numberrevision_date.ticket_number không thay đổi khi bạn sửa đổi vé, nhưng idrevision_date làm. Sau đó, tùy thuộc vào ngữ cảnh, bạn có thể nhận được bản sửa đổi cụ thể hoặc bản sửa đổi mới nhất của một vé cụ thể, sử dụng groupwise max.

+0

Tôi đã từng thấy điều đó trước đây. Nó có thể sẽ là hoàn hảo cho một wiki khi bạn chỉ xem một phiên bản hoặc so sánh hai phiên bản. Đối với mục đích của tôi nhiều hơn nữa mã là cần thiết để xem những thứ thay đổi khi là một trong những quan điểm lớn. – epochwolf

3

Tôi đã làm một cái gì đó như thế này. Tôi có một bảng gọi là LoggableEntity có chứa: ID (PK).

Sau đó, tôi có bảng EntityLog chứa thông tin về các thay đổi được thực hiện cho loggableentity (bản ghi): ID (PK), EntityID (FK đến LoggableEntity.ID), ChangedBy (tên người dùng đã thay đổi), ChangedAt (smalldatetime khi thay đổi đã xảy ra), Loại (enum: Tạo, Xóa, Cập nhật), Chi tiết (trường ghi nhớ có chứa những gì đã thay đổi - có thể là một XML với các chi tiết được tuần tự hóa).

Bây giờ mọi bảng (thực thể) mà tôi muốn theo dõi được "dẫn xuất" từ bảng LoggableEntity - điều đó có nghĩa là ví dụ Khách hàng có FK đến bảng LoggableEntity.

Bây giờ mã DAL của tôi sẽ xử lý việc điền bảng EntityLog mỗi khi có thay đổi được thực hiện cho bản ghi khách hàng. Mỗi khi nó thấy rằng lớp thực thể là một loggableentity thì nó thêm bản ghi thay đổi mới vào bảng entitylog.

Vì vậy, đây là cấu trúc bảng của tôi:

+------------------+   +------------------+ 
| LoggableEntity |   | EntityLog  | 
| ---------------- |   | ---------------- | 
| (PK) ID   | <--+  | (PK) ID   | 
+------------------+ +----- | (FK) LoggableID | 
     ^     |  ...   | 
     |      +------------------+ 
+------------------+ 
| Customer   | 
| ---------------- | 
| (PK) ID   | 
| (FK) LoggableID | 
|  ...   | 
+------------------+ 
+0

bạn có sử dụng công cụ để tạo biểu đồ lược đồ không? –

+0

Nó phụ thuộc vào những gì bạn đang nói đến. Khi tôi làm việc trên một cái gì đó tôi thường sử dụng SparX Enterprise Architect (http://www.sparxsystems.com/products/ea/index.html). Nhưng nếu bạn muốn tạo sơ đồ lược đồ cho bài đăng này thì không. Chỉ ASCII thuần túy. :-( –

Các vấn đề liên quan