2009-03-24 27 views
6

Thiết kế cơ sở dữ liệu của tôi trước đây khá tuyến tính, vì vậy tôi đang bị bối rối về những gì có thể là một vấn đề rất dễ giải quyết.Nhiều phím ngoài

Tôi có bảng "POSTS", chứa các bài đăng có thể là con của "CATEGORY" hoặc "TOPIC". Điều gì sẽ là cách tốt nhất để xác định (các) khóa ngoại cho bảng "BÀI ĐĂNG"?

Tôi cho rằng tôi có thể có một cột tên là POST_CATEGORY_ID và một trường có tên là "POST_TOPIC_ID, mà có thể là nullable, nhưng điều này chỉ âm thanh không đúng. Chắc chắn đó là một giải pháp đơn giản mà tôi đang thiếu!

Trả lời

2

Bạn có thể làm nhiều-nhiều mối quan hệ giữa POST và LOẠI và POST và TOPIC:

POST 
---- 
ID 
Text ... 
... 

CATEGORY 
-------- 
ID 
Name 

TOPIC 
----- 
ID 
Name 

POST_CATEGORY 
------------- 
POST_ID (FK) 
CATEGORY_ID (FK) 

POST_TOPIC 
---------- 
POST_ID (FK) 
TOPIC_ID (FK) 

Bằng cách này, một bài đăng có thể được liên kết với bất kỳ số lượng chủng loại và chủ đề nào.

+0

Điều này nghe có vẻ mở rộng hơn - ít nhất là từ quan điểm bảng trung gian, nhưng điều này không chỉ là lấy các cột vô giá trị của tôi ra khỏi bảng POSTS và tạo một bảng mới ra khỏi chúng? –

+0

Tôi nghĩ bạn sẽ không cần bất kỳ nullables nếu bạn làm điều này. Bạn chỉ chèn một bản ghi trong bảng nhiều người nếu mối quan hệ tồn tại –

+0

Đợi một chút - Tôi nghĩ tôi sẽ theo dõi ngay bây giờ. Vì vậy, trong tương lai, chúng ta hãy nói rằng tôi có một bảng mới được gọi là SÁCH mà yêu cầu con POSTS, tôi chỉ cần thêm một bảng gọi là POST_BOOK với các phím nước ngoài để POSTS và SÁCH? –

1

tôi nghĩ rằng một tuyên bố chính nước ngoài chỉ có thể tham khảo một bảng duy nhất:

FOREIGN KEY(CATEGORY_ID) REFERENCES CATEGORY(CATEGORY_ID); 
FOREIGN KEY(TOPIC_ID) REFERENCES TOPIC(TOPIC_ID); 

Nếu tôi đúng, bạn sẽ cần phải có hai phím nước ngoài, người ta cho bảng LOẠI và một cho TOPIC, và cả hai cần để được nullable

4

Bạn đang đi đúng hướng h các trường POST_CATEGORY_ID và POST_TOPIC_ID có thể bỏ qua. Điều này sẽ mô hình hóa một bài tùy chọn có liên quan đến một thể loại và tùy ý liên quan đến một chủ đề.

Nếu điều này có nghĩa là độc quyền và bắt buộc, bạn sẽ cần phải thêm ràng buộc kiểm tra là rỗng, nhưng không phải cả hai.

+0

Điều khiến tôi băn khoăn về điều này là điều gì sẽ xảy ra nếu một thứ khác sau này chứa POSTS? Tôi phải sửa đổi bảng để hỗ trợ một cột nullable khác tham khảo bảng mới. Tôi không miễn dịch khi làm điều đó, dường như nó có vẻ như đang tắt. –

0

Cách tốt nhất là sử dụng Thừa kế. Bạn sẽ có hai chuyên ngành của "bài": "Posts_Category" và "Posts_Topic" Cả hai đều có "post_id" (có liên quan đến bảng cha "bài") và các lĩnh vực khác:

"category_id" ("Posts_Category")

"Topic_ID" ("Posts_Topic")

Nếu điều này nghe nhầm lẫn nhìn vào thuyết (PHP ORM) vào tài liệu của họ: http://www.doctrine-project.org/documentation/manual/1_0/en/inheritance

0

Nếu bạn muốn xác định các phím nước ngoài trong cơ sở dữ liệu, các giải pháp mà bạn đang đề xuất Nghe có vẻ đúng. Tôi cũng khuyên bạn nên viết một số mã trong trình kích hoạt để đảm bảo rằng cả hai trường đều không có giá trị.

1

Làm thế nào về việc có thể loại và chủ đề trong cùng một bảng

tạo topics_categories bảng (số id, mô tả varchar2 (100), item_type char (1)); --C hoặc T

Sau đó, một chìa khóa nước ngoài duy nhất để topics_categories

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