2011-10-07 44 views

回答

1

爲此,您通常會有一箇中間表。下面是一個示例模式

Table - Question 
QuestionID 
Title 
Body 
Date 

Table - Tag 
TagID 
TagName 

Table - QuestionTag 
QuestionID 
TagID 

在這樣的模式中,問題表包含問題。標籤表格包含可應用於問題的標籤列表(如本網站所示)。 QuestionTag將兩者連接在一起,這樣一個問題就可以鏈接到任意數量的標籤。爲了得到它的標籤一個具體的問題,你可以做以下

SELECT Question.QuestionID, Question.Title,Question.Body,Question.Date,GROUP_CONCAT(Tag.TagName) 
FROM Question 
LEFT JOIN QuestionTag 
ON Question.QuestionID = QuestionTag.QuestionID 
LEFT JOIN Tag 
ON QuestionTag.TagID = Tag.TagID 
WHERE [email protected] 
GROUP BY Question.QuestionID 
1

使用一個例子:

對於一個書店,作者可以有任意數量的書籍。

+Table_Author+ 
-------------- 
id 
name 
-------------- 

+Table_Book+ 
------------ 
id 
title 
author_id <--this is the key! 
------------ 

然後你就可以得到每本書針對特定作者:

SELECT books.title FROM Table_Book books WHERE books.author_id=2 

內容類型的方法:

+Table_contentype+ 
------------------- 
id 
name 
table_name_from_model --don't know how to properly call it 
------------------- 

+Table_Person+ 
--------------- 
id 
name 
--------------- 

+Table_Person_Objects+ 
----------------------- 
id 
person_id 
content_type_id 
object_id 
----------------------- 

Then your person can have, for example: 

+Table_contentype+ 
-------------------------------------- 
id   name   table_name 
-------------------------------------- 
1   Item A   items_a_table 
1   Item B   items_b_table 
-------------------------------------- 

+Table_Person_Objects+ 
-------------------------------------------------- 
id person_id content_type_id  object_id 
-------------------------------------------------- 
1  1    1     1 
2  1    1     4 
3  1    2     2 
4  2    1     1 
-------------------------------------------------- 

這樣一來,1個人可以有2 Items_A(1, 4)1 Item_B(2)和person 2可以具有與Person 1相同的Item_A(1)。

這個我認爲是我能想到的最靈活的方案。

+0

我正在使用的數據沒有像這樣的靜態關係。這對一個人的物品來說更像是一種關係。就像一個人擁有這些物品,而人擁有x個物品(一些物品可以/將是相同的) – TheDog

+0

噢,好的。你應該把它放在你的問題中。然後你可以使用類似於django中「內容類型」概念的東西。我會將其添加到答案 – santiagobasulto

+0

這應該怎麼表達?我想確保我的問題對其他人有幫助 – TheDog

1
  1. 你能舉個例子嗎?也許你的模式可以重構,以便它不需要這樣的花式約束?

  2. 明顯:定義多個約束,儘可能多的。

  3. 定義觸發器可以防止表中不滿足關係的行。

但我仍然懷疑可以重新定義表結構來簡化事情。

+0

描述它的最佳方式是擁有許多「物品」的「人物」表格,但這些物品也可以由其他人擁有。 – TheDog

+0

@TheDog:我的經驗法則是將您的餐桌命名爲單數:'人'和'項目',這簡化了對多對多關係(對我而言)的理解。解決你的問題很簡單,你已經接受了:) – 9000

相關問題