2009-08-16 19 views
5

Tôi sẽ sớm bắt đầu làm việc trên một dự án (từ thông số kỹ thuật) nhắc tôi một chút về StackOverflow. Về cơ bản, một ứng dụng web có nội dung do người dùng kiểm soát.Thực hiện kiểm soát phiên bản của các đối tượng DB

Một trong những tính năng giúp tôi khám phá vòng kết nối trong tâm trí của mình là kiểm soát phiên bản. Ở đây trên StackOverflow, mỗi câu hỏi và câu trả lời có thể có nhiều bản sửa đổi. Điều này là khá đơn giản để thực hiện khi bạn chỉ có một loại đối tượng (và, trong trường hợp này là văn bản của nó).

Vì vậy, đối với các trang đơn giản của tôi, tôi đã được đặt.

Sự cố xảy ra khi tôi xem xét rằng một số đối tượng cần được kiểm soát phiên bản có mối quan hệ. Để cung cấp ví dụ cụ thể, hãy để tôi chọn một miền ngẫu nhiên mang tính hậu môn:

Cho phép nói rằng tôi đang triển khai trang web giống như Wiki để theo dõi thông tin sách/tác giả. Trọng tâm chính của trang web là tạo và cập nhật các trang "Tác giả", trong đó, dưới dạng văn bản, khá đơn giản (như trên). Tuy nhiên, chúng ta hãy thêm một liên kết một-nhiều giữa các tác giả và sách (nói cách khác, sách sẽ là các đối tượng riêng biệt, rõ ràng là một người có thể viết nhiều sách). Mỗi cuốn sách sẽ có một liên kết từ trang Tác giả đến một trang thông tin về cuốn sách đó.

Đối với người dùng, có rất ít sự khác biệt giữa "tóm tắt" dựa trên văn bản mô tả tác giả và liên kết giữa tác giả đó & tác phẩm của họ. Do đó, chúng tôi có yêu cầu triển khai tính năng "sửa đổi"/chỉnh sửa cho trang tác giả, trang sách, liên kết giữa tác giả và sách. Nói cách khác, người dùng có thể chỉnh sửa, xem lịch sử và các trang tác giả rollback, các trang sách và các liên kết giữa hai trang.

Điều này càng trở nên phức tạp hơn khi mối quan hệ đó trở thành nhiều, nhiều nơi mà nhiều tác giả có thể được liệt kê là đã đóng góp cho một cuốn sách.

Tôi có một số giải pháp, nhưng không có giải pháp nào trong số đó như tôi muốn (và liên quan đến ít nhất một số mã lặp lại/lưu trữ dữ liệu dự phòng), và mặc dù tôi thấy tính phổ biến trên toàn bộ địa điểm ở đây, tôi cảm thấy rằng tôi đã không thực sự có thể giải nén nó tốt nhất, đặc biệt là ở cấp độ cơ sở dữ liệu. Tôi không muốn thiên vị các câu trả lời được đưa ra vì vậy tôi sẽ không cung cấp cho họ ngay lập tức.

Vì vậy, bạn sẽ thiết kế hệ thống này ở cấp cơ sở dữ liệu như thế nào? Tôi đang tìm thông số kỹ thuật bảng ở đây và có thể mô tả cách bạn sẽ sử dụng chúng, nếu nó không rõ ràng ngay lập tức. Đối với những câu trả lời mà nó có thể có liên quan, tôi sẽ được sử dụng ASP.NET và hoặc là LINQ-to-SQL (Tôi cảm thấy thoải mái với nhiều-to-nhiều trong LTS) hoặc Entity Framework.

EDIT: Để làm rõ, tôi hiểu thiết kế DB cơ bản, chuẩn hóa, nhiều bảng lập bản đồ, v.v ... Tôi đang tìm giải pháp sạch cho tình huống cụ thể này.

CHỈNH SỬA 2: Tôi đang tìm giải pháp có thể tổng quát, vì có thể có nhiều đối tượng phụ trong hệ thống hơn là chỉ sách. Tác giả có thể liên quan đến các tác giả, tạp chí, sự kiện khác, v.v. v.v. Tôi cảm thấy mình đang lặp lại rất nhiều công việc nếu tôi triển khai lịch sử riêng cho từng tác phẩm.

+0

@JoshJordan: Đừng xin lỗi. Sửa chữa câu hỏi để được nhiều hơn đến điểm. –

Trả lời

5

Đây là vấn đề phổ biến đủ trong kho dữ liệu. Họ sử dụng "kích thước từ từ thay đổi".

Tuy nhiên, phải có một số quy tắc nếu bạn định thử và có dữ liệu "được phiên bản".

  1. Bạn phải ghi lại mối quan hệ Sách-Sách như được định nghĩa ban đầu. Đây chính là mối quan hệ giữa Tác giả và Sách. Đó là điều mà các nhà kho dữ liệu gọi là "bảng thực tế ít thực tế". Đó là cặp chìa khóa.

  2. Sách là thứ nguyên của thực tế tác giả sách. Cuốn sách có thể thay đổi. Có rất nhiều thuật toán kích thước thay đổi từ từ. Bạn chỉ có thể giữ mới nhất, có bảng lịch sử tách biệt với hiện tại. Giữ lịch sử và hiện tại trong một bảng có cờ để phân biệt hiện tại với lịch sử.

  3. Tác giả là thứ nguyên của thực tế tác giả sách. Tác giả có thể thay đổi. Một lần nữa, có rất nhiều thuật toán SCD. Đọc trên các lựa chọn. Bởi Bộ công cụ kho dữ liệu của Ralph Kimball để biết thêm thông tin.

Lưu ý rằng mối quan hệ (tác giả đặt) là một thực tế và không cần phiên bản. Đó là thực tế. Nó không "thay đổi". Đó là sự thật hoặc nó được đặt trong cơ sở dữ liệu do lỗi - trong trường hợp đó, nó phải được loại bỏ. Sự kiện không cần số phiên bản.

Trong lược đồ hình sao tinh vi hơn, các sự kiện của bạn có các biện pháp. Giá, khối lượng bán, chi phí, lợi nhuận, vv Đây cũng được ghi lại trong bảng thực tế. Những thông tin này có thể thay đổi theo thời gian. Vì vậy, bạn hầu như luôn luôn có một chiều thời gian cho mỗi thực tế.

Do đó, Thời gian là thứ nguyên của thực tế của tác giả sách. Nếu thực tế này có thể thay đổi, khoảng thời gian áp dụng được ghi lại như một phần của thực tế.

Thứ nguyên thời gian không hoàn toàn giống với số phiên bản. Nó đơn giản hơn một chút. Nó nói rằng tại một điểm nhất định trong thời gian, thực tế là sự thật. Nếu thực tế thay đổi, bạn nối thêm một thực tế mới với một dấu thời gian khác.

Bạn có thể, được cung cấp một thời điểm cụ thể, xác định các thông tin có liên quan và các giá trị thứ nguyên được liên kết.

+0

Chương trình hay. Cảm ơn bạn. Văn học SCD rất hữu ích. – JoshJordan

+0

Cảm ơn. Tôi nên xem xét lại lý do tại sao/cho dù tôi muốn có một bảng lịch sử riêng biệt cho mỗi bảng, thay vì giữ dữ liệu cũ của mỗi bảng trong bảng chính nó. – ChrisW

+0

@ChrisW: Thiết kế SCD khó. Nó phụ thuộc vào các loại truy vấn bạn sẽ nhận được. Do folks có "truy vấn" thực tế "(" what-if ")? "Nếu những con số bán hàng này được báo cáo theo định nghĩa của khu vực năm ngoái thì sao?" Trong trường hợp này, bạn có thể tham gia chống lại các hàng thứ nguyên lịch sử. Nếu bạn làm điều này hiếm khi, một bảng lịch sử riêng biệt không bị tổn thương. Nếu bạn làm điều này thường xuyên, một bảng lịch sử riêng biệt có thể quá phức tạp. –

1

Tôi có một bảng cho mỗi bảng: tức là Tác giả và Sách.

Có mối quan hệ khóa ngoài thông thường (bất kể đó là gì) giữa các bảng.

Mỗi bảng cũng có một bảng lịch sử, ví dụ: AuthorHistory và BookHistory. Các bảng lịch sử này chứa các phiên bản cũ/lỗi thời của các bản ghi (ví dụ: mỗi bản ghi Tác giả đã xóa và/hoặc đã chỉnh sửa). Không có mối quan hệ khóa ngoại từ/từ các bảng lịch sử.


Edit:

Một số chức năng tương tự cho mỗi bảng: ví dụ, cho dù bảng, cập nhật một kỷ lục có nghĩa là lưu trữ các bản sao cũ của các bản ghi trong bảng lịch sử tương ứng te. Tôi thực hiện chức năng này bằng cách sử dụng các trigger cơ sở dữ liệu (cập nhật và xóa các trigger cho mỗi bảng); bởi vì công cụ cơ sở dữ liệu mà tôi đang sử dụng các trình kích hoạt hỗ trợ và điều đó làm cho nó trở nên trong suốt đối với ứng dụng. Mã trong các trình kích hoạt này tương tự từ bảng này sang bảng khác (chỉ có tên của bảng và danh sách các tên trường, khác với một bảng kế tiếp).


Điều gì về trường hợp nhiều người? Đây là khó khăn hơn bởi vì bạn thực sự có thể không có kỷ lục lập bản đồ một tác giả một cuốn sách, nhưng trước đây đã một và cần phải chứng minh rằng khi một mục lịch sử

Chỉnh sửa # 2:

Tôi có không đã thực hiện lịch sử của một tình huống nhiều đến nhiều, nhưng tôi không thấy tại sao nó sẽ không giống nhau, tức là:

  • Mối quan hệ nhiều-nhiều được thực hiện bởi có một bảng BookAuthor , mỗi bản ghi có chỉ là BookId cộng với AuthorId.
  • Các mối quan hệ lịch sử nằm trong bảng BookAuthorHistory tương ứng.
+0

Còn tình huống nhiều-nhiều thì sao? Điều này là khó khăn hơn bởi vì bạn thực sự có thể không có bản đồ ghi lại một tác giả cho một cuốn sách, nhưng trước đây đã có một và cần phải cho thấy đó là một mục lịch sử. – JoshJordan

+0

Thật vậy, bạn nói đúng. Thật không may, đây không phải là một giải pháp rất chung/có khả năng mở rộng. Nó đòi hỏi một bảng History mới cho mỗi bảng mới được thực hiện. – JoshJordan

+0

Tôi không thấy những gì không chung/khả năng mở rộng về điều đó: IMO là một giải pháp "chung" theo nghĩa là nó là một giải pháp hoạt động cho bất kỳ bộ bảng nào. – ChrisW

1

Âm thanh gần giống như trường hợp sử dụng lý tưởng cho CouchDB. Với cơ sở dữ liệu hướng tài liệu này, bạn sẽ nhận được bản sửa đổi miễn phí (mỗi tài liệu được sửa đổi tự động trừ khi bạn cấu hình cơ sở dữ liệu của mình khác nhau).

Cũng có thể có mối quan hệ m: n giữa các tài liệu. Tuy nhiên, việc chuyển sang CouchDB là một bước tiến lớn và tôi không biết nó có thể truy cập tốt như thế nào từ ASP.NET. Nhưng đọc một số hướng dẫn giới thiệu không thể làm tổn thương.

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