2010-09-16 30 views
9

Tôi có 3 phương án:Làm thế nào để thiết kế giản đồ cho một cái gì đó giống như các thẻ câu hỏi StackOverflow?

1, trong các câu hỏi bảng:

question 
------------------------------------ 
id title content ...  tags 
------------------------------------ 
1 aaa  bbb  ...  tag1,tag2,tag3 (use , to split more tags) 

2, trong bảng và chia tags:

tags 
------------------------------------ 
id tag 
------------------------------------ 
1 tag1,tag2,tag3 (use , to split more tags) 

3, trong bảng thẻ:

tags 
------------------------------------ 
id tag 
------------------------------------ 
1 tag1 
2 tag2 
3 tag3 

Tôi nghĩ rằng kế hoạch 3 là tốt hơn, nhưng ý kiến ​​của bạn là gì?

Bất kỳ ý tưởng hay nào khác cho việc triển khai này?

Cảm ơn sự giúp đỡ :)

+2

Vui lòng xem [ Làm thế nào để bạn đề nghị triển khai thẻ hoặc gắn thẻ ] (http://stackoverflow.com/questions/20856/how-do-you-recommend-implementing-tags-or-tagging). –

Trả lời

12

Các mẫu này được gọi là mysqlicious, scuttletoxi (từ ít nhất đến bình thường hóa nhất).

Tất cả đều có lợi ích và hạn chế của họ. Bạn có thể đọc một phân tích khá tốt ở đây:

http://forge.mysql.com/wiki/TagSchema (WayBackMachine Version)

Lưu ý rằng mysqlicious phụ thuộc nhiều vào khả năng thực hiện FULLTEXT tìm kiếm hiệu quả của cơ sở dữ liệu của bạn.

Điều này có nghĩa là đối với MySQL với InnoDB và đối với một số hệ thống khác, điều này rất không thực tế.

1

Phụ thuộc vào mức độ bình thường của dữ liệu bạn muốn.

Thứ nhất, tôi rạn nứt khi tôi thấy cột "id" trong bảng không phải là duy nhất. Ít nhất hãy đổi tên cột thành "question_id".

Thứ hai, tùy thuộc vào việc bạn có muốn liệt kê nhanh tất cả các thẻ được xác định hay không. Trong trường hợp này, bạn cần một bảng thẻ riêng biệt xác định tập hợp các thẻ có thể, và sau đó là một bảng trung gian giữa các câu hỏi và các thẻ cung cấp liên kết nhiều thành viên.

6

Mối quan hệ giữa thẻ và nội dung là many-to-many. Điều này có nghĩa là một thẻ có thể được liên kết với một vài đơn vị nội dung và một đơn vị nội dung có thể được liên kết với một số thẻ.

Để thực hiện điều này trong cơ sở dữ liệu, bạn có thể sử dụng bảng phụ được gọi là ContentTags. Mối quan hệ của Content đến ContentTags là một-nhiều; mối quan hệ của Tags đến ContentTags là một-nhiều.

#Tags Table 
Id Text 
1 'Tag1' 
2 'Tag2' 
3 'Tag3' 


#Content Table 
Id Content 
1 "some content" 
2 "other content" 
3 "more content" 

#ContenTags Table 
ContentId TagId 
1   1 
1   2 
2   1 
2   2 
2   3 
3   1 

Như bạn thấy, mối quan hệ được phản ánh rõ ràng (nội dung 1 được kết hợp với thẻ 1 và 2; nội dung 2 được gắn liền với thẻ 1, 2, và 3; nội dung 3 chỉ gắn liền với thẻ 1)

1

Cách tiếp cận đúng là tạo mối quan hệ một-nhiều, nghĩa là bạn có một nhận xét và nhiều thẻ.Từ WIKI

Trong công nghệ cơ sở dữ liệu, mối quan hệ một-nhiều (còn được gọi là nhiều) xảy ra khi một thực thể liên quan đến nhiều lần xuất hiện trong thực thể khác. Ví dụ, một câu lạc bộ có nhiều thành viên.

Và khái niệm chính trong thiết kế cơ sở dữ liệu là Database normalization.

Vì vậy, tôi sẽ làm như thế này.

comments 
------------------------------------ 
id_comment title content 
------------------------------------ 
12   aaa  bbb 

tags 
------------------------------------ 
id_tag comment_id tag 
------------------------------------ 
1  12   tag1 
2  12   tag2 
3  12   tag3 
+0

Loại thiết kế này sẽ có ** rất nhiều dự phòng ** trong thẻ ** đã gửi ** vì có nhiều nhận xét chia sẻ cùng một thẻ. Ví dụ: chúng tôi có thể có 1 triệu nhận xét được gắn thẻ "tag1". Bằng cách này, nếu tôi chấp nhận sự thừa, sau đó tôi thấy một vấn đề khác: không có sử dụng bằng cách đặt ** id_tag ​​** và ** tag ** cùng một lúc trong bảng thẻ **. Chúng tôi chỉ cần thẻ, ** không cần id_tag ​​nếu bảng này đã comment_id **. –

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