2010-04-24 45 views
5

Tôi phải thêm chức năng vào một ứng dụng hiện có và tôi đã chạy vào tình huống dữ liệu mà tôi không chắc chắn cách lập mô hình. Tôi đang bị hạn chế trong việc tạo ra các bảng và mã mới. Nếu tôi cần phải thay đổi cấu trúc hiện tại, tôi nghĩ rằng khách hàng của tôi có thể từ chối đề xuất .. mặc dù nếu cách duy nhất của nó để làm cho nó đúng, đây là những gì tôi sẽ phải làm.Làm thế nào để mô hình hóa mối quan hệ loại trừ lẫn nhau trong SQL Server

Tôi có một bảng Mục có thể liên kết với bất kỳ số lượng bảng nào và các bảng này có thể tăng theo thời gian. Mục chỉ có thể liên kết với một bảng khác, nhưng bản ghi trong bảng khác có thể có nhiều mục được liên kết với nó.

Ví dụ về các bảng/thực thể được liên kết là Person, Vehicle, Building, Office. Đây là tất cả các bảng riêng biệt.

Ví dụ về mục là Pen, Stapler, Cushion, Tyre, A4 Paper, Plastic Bag, Poster, Decoration"

Ví dụ một Poster có thể được phân bổ cho một Person hoặc Office hoặc Building. Trong tương lai nếu họ thêm một bảng Conference Room nó cũng có thể được thêm vào đó.

suy nghĩ intital của tôi là:

Item 
{ 
    ID, 
    Name 
} 

LinkedItem 
{ 
    ItemID, 
    LinkedToTableName, 
    LinkedToID 
} 

Trường LinkedToTableName sau đó sẽ cho phép tôi để xác định các bảng đúng liên kết đến trong mã của tôi.

Tôi không quá hài lòng với giải pháp này, nhưng tôi hoàn toàn không thể nghĩ ra bất kỳ điều gì khác. Hãy giúp tôi! :)

Cảm ơn!

+0

Sẽ giúp ích nếu bạn giải thích thêm về loại dữ liệu bạn đang lưu trữ và lý do; ví dụ: các bài đăng trên blog, người hoặc mục trong siêu thị, v.v ...? Các bảng mục tiêu đại diện cho điều gì? Tôi nghĩ rằng trừu tượng của bạn bị hỏng, nhưng hầu như không thể nói tại sao, hoặc đề xuất một cách tiếp cận khác mà không biết vấn đề bạn đang cố giải quyết với nó. –

+0

Cảm ơn Rowland. Tôi đã cố gắng thêm vào câu hỏi của mình. Xem Chỉnh sửa Q. Tôi sẽ chỉnh sửa lại nếu điều này vẫn chưa đủ thông tin :) – littlechris

Trả lời

12

Không nên lưu tên bảng dưới dạng giá trị cột. Đây là một hack xấu.

Có hai cách tiêu chuẩn để thực hiện những gì bạn đang cố gắng làm. Đầu tiên được gọi là thừa kế một bảng. Điều này có thể dễ dàng được hiểu bởi các công cụ ORM nhưng giao dịch tắt một số chuẩn hóa. Ý tưởng là, tất cả các thực thể này - Person, Vehicle, bất kỳ - được lưu trữ trong cùng một bảng, thường với một số cột không sử dụng cho mỗi mục nhập, cùng với trường phân biệt phân biệt trường xác định loại thực thể.

Trường phân biệt đối xử thường là loại số nguyên, được ánh xạ tới một số liệt kê trong mã của bạn. Nó cũng có thể là khóa ngoài đối với một số bảng tra cứu trong cơ sở dữ liệu của bạn, xác định những con số nào tương ứng với loại nào (không phải là tên bảng, chỉ mô tả).

Cách khác để thực hiện điều này là thừa kế nhiều bảng, tốt hơn cho cơ sở dữ liệu của bạn nhưng không dễ dàng lập bản đồ trong mã. Bạn làm điều này bằng cách có một bảng cơ sở xác định một số thuộc tính chung của tất cả các đối tượng - có thể chỉ là ID và tên - và tất cả các bảng "cụ thể" (Person v.v.) sử dụng ID cơ sở làm khóa ngoại duy nhất (thường cũng là khóa chính).

Trong trường hợp đầu tiên, tính độc quyền là ẩn, vì tất cả các thực thể nằm trong một bảng. Trong trường hợp thứ hai, mối quan hệ nằm giữa số Item và số thực thể cơ sở, cũng đảm bảo tính duy nhất.

Lưu ý rằng với thừa kế nhiều bảng, bạn có vấn đề khác - bạn không thể đảm bảo rằng một ID cơ sở được sử dụng chính xác bởi một bảng thừa kế. Nó có thể được sử dụng bởi một số, hoặc không được sử dụng ở tất cả. Đó là lý do tại sao nhiều bảng kế thừa kế hoạch thường cũng có một cột phân biệt đối xử, để xác định bảng nào là "mong đợi". Một lần nữa, phân biệt đối xử này không giữ một tên bảng, nó giữ một giá trị tra cứu mà người tiêu dùng có thể (hoặc có thể không) sử dụng để xác định bảng nào khác để tham gia.

Thừa kế nhiều bảng là kết hợp gần hơn với giản đồ hiện tại của bạn, vì vậy tôi khuyên bạn nên làm điều đó trừ khi bạn cần sử dụng điều này với LINQ to SQL hoặc ORM tương tự.

Xem tại đây để có hướng dẫn chi tiết tốt: Implementing Table Inheritance in SQL Server.

0

bảng liên kết của bạn là ok.

sự cố bạn sẽ gặp phải là bạn sẽ cần phải tạo sql động khi chạy. sql tham số thường không cho phép các đối tượng trong danh sách FROM là tham số.

i fyou muốn tránh điều này, bạn có thể không chuẩn hóa được một chút - bằng cách tạo bảng để giữ id (giả sử id là duy nhất trên các bảng khác) và type_id đại diện cho bảng nào là nguồn, và mô tả được tạo - ví dụ giá trị tên từ bản ghi inital.

bạn sẽ kích hoạt việc tạo danh sách không chuẩn hóa này khi thông tin cơ sở được sửa đổi và bạn có thể sử dụng nó cho truy vấn được tổng quát - và sau đó sử dụng truy vấn động của mình khi cần.

9

Tìm một cái gì đó chung cho Person, xe, Building, Văn phòng. Vì thiếu một cụm từ tốt hơn, tôi đã sử dụng Thực thể. Sau đó, triển khai mối quan hệ loại siêu/loại phụ giữa Thực thể và các loại phụ của nó. Lưu ý rằng EntityIDPKFK trong tất cả các bảng loại phụ. Bây giờ, bạn có thể liên kết bảng Mục với Thực thể (chủ sở hữu). Trong mô hình này, một mục chỉ có thể thuộc về một Thực thể; một Pháp nhân có thể có (riêng) nhiều mục.

model_mutually_exclusive_01

+1

Bạn đã sử dụng phần mềm nào để tạo hình ảnh đó? – goat

+0

@chris, Visio 2007 –

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