2009-09-19 88 views
5

Tôi có 4 lớp con: Video, Image, NoteForm. Mỗi loại chứa các loại dữ liệu khác nhau. Ví dụ: lớp Image chứa đường dẫn đến tệp hình ảnh trên thuộc tính đĩa và hình ảnh và lớp Form chứa các giá trị trường biểu mẫu. Tuy nhiên, yếu tố chung giữa mỗi mục là tọa độ GPS và tiêu đề, vì vậy tôi có lớp cơ sở trừu tượng sau:mô hình lớp cơ sở trừu tượng và các lớp con trong cơ sở dữ liệu

public abstract class Content 
{ 
    public float? Latitude { get; set; } 
    public float? Longitude { get; set; } 
    public float? Heading { get; set; } 
} 

Tuy nhiên, nơi tôi thấy mơ hồ về cách mô hình hóa cơ sở dữ liệu này. Hiện tại, tôi có một bảng gọi là Events (ví dụ: một sự kiện là bữa tiệc sinh nhật) và 4 bảng (Videos, Images, NotesForms). Mỗi bảng có khóa ngoại liên kết trở lại với khóa chính là Events.

Sử dụng LINQ to SQL, tôi nhận được 5 lớp cho mỗi bảng. Điều này là tốt nếu tôi chỉ muốn một loại dữ liệu, ví dụ Event.Images, nhưng những gì tôi muốn làm là đếm tổng số 'nội dung' một Event có và nhận tọa độ GPS. Tôi có thể đếm số lượng dễ dàng bằng cách chỉ sử dụng Event.Images.Count() + Event.Videos.Count() + ..., nhưng tôi không thể làm tương tự cho các tọa độ GPS. Có cách nào tôi có thể mô hình hóa cơ sở dữ liệu để tôi có thể sử dụng một lớp cơ sở cho mỗi mục và vẫn có thể có được mục được đánh máy mạnh khi tôi cần xem dữ liệu của nó?

Trả lời

8

Có ba mô hình khác nhau cho tài liệu này trong Patterns của Doanh nghiệp ứng dụng Kiến trúc, mỗi thương mại-offs khác nhau Martin Fowler:

+0

Cám ơn các liên kết. Họ không chính xác đưa ra một mô tả tốt về cách sử dụng các mô hình, nhưng nó mang lại cho tôi một điểm khởi đầu để nghiên cứu thêm. Cá nhân, tôi luôn nghĩ rằng mô hình bảng đơn là một ý tưởng tồi vì nó có nghĩa là nếu bạn thêm một lớp con mới, bạn sẽ phải thêm vào các cột mới cho dữ liệu của nó và có thể phát ra một kích thước không mong muốn, mặc dù đối với các ứng dụng nhỏ hơn, tôi có thể thấy giá trị của việc sử dụng nó. –

+0

Ya, có các giao dịch nhất định. Nó chỉ phụ thuộc vào khả năng thêm các loại mới. Nếu không, có thể tốt hơn là tránh đi qua nhiều bảng và sử dụng bảng đơn. Nếu có thể, một trong các mẫu khác. Và, vâng, những liên kết này khá thưa thớt vì họ muốn bạn mua cuốn sách :-) Đó là một cuốn sách hay - đáng để tôi nghĩ. – SingleShot

1

Đó là một cách để làm điều đó.

Nói chung, có hai cách khác:

  • bảng mỗi sub-class: thay vì cố gắng để chia sẻ baseclass trong cơ sở dữ liệu, chỉ cần tạo bảng riêng biệt cho mỗi một.

  • bảng trên mỗi phân cấp: đặt một siêu của tất cả các trường vào bảng, cũng như cột "phân biệt đối xử" và lưu trữ chúng ở một nơi.

Để tìm ra là đúng, suy nghĩ về các mô hình sử dụng:

  • nếu bạn thường đối xử với họ một cách độc lập, và truy vấn một cách độc lập, các bảng riêng biệt là một cách tốt để go-- hoặc những gì bạn có hoặc bảng trên mỗi lớp con.
  • nếu chúng được coi là bộ sưu tập đồng nhất, do đó bạn muốn nhìn vào họ như vậy, một bảng duy nhất có thể được dễ dàng hơn

Cũng xem những gì công cụ của bạn hỗ trợ một cách tự nhiên nhất. Họ đều làm việc.

+0

Cảm ơn bạn đã phản hồi. Nó chỉ ra rằng tôi cần phải thay đổi toàn bộ mô hình miền xung quanh anyway, vì vậy vấn đề của tôi cố định chính nó, do đó, để nói chuyện. –

-2

Thực ra, câu hỏi chính xác này được hỏi rất nhiều và đã là answered many times. Bạn có thể đã không tìm kiếm bằng cách sử dụng thuật ngữ cơ sở dữ liệu.

Vấn đề đang áp dụng thuật ngữ OO và suy nghĩ trong một lĩnh vực chủ đề không đối tượng; thực hiện một nhiệm vụ thẳng về phía trước rất phức tạp và hạn chế.

Sách của Martin Fowler và Scott Ambler không đáng giá một đô la, chi tiết trong số this answer, bắt đầu từ mục nhập 11 tháng 12 10.

+6

-1, tôi đã đặt câu hỏi này vào 2009-09-19, trước khi các bài viết bạn liên kết được tạo. Câu trả lời của bạn không phải là câu trả lời chút nào, mà là che giấu những lời lăng mạ mỏng manh chống lại tôi và hai cá nhân được kính trọng trong ngành. –

+2

@Daniel. Chủ đề này tiếp tục đến, trên các chủ đề khác (hiện tại), đó là cách tôi tìm thấy nó. Xin lỗi, tôi đã không nhận thấy nó là từ năm 2009. Không xúc phạm dành cho bạn. Fowler & Ambler có rất nhiều câu trả lời. Tôi rất sẵn lòng trả lời các chi tiết cụ thể, nhưng không thể trả lời các chung chung về Fowler/Ambler hoặc cảm giác của bạn (ví dụ: "xúc phạm" là gì?) – PerformanceDBA

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