在mysql中引用多个项目的正确方法?

时间:2011-10-07 23:52:31

标签: mysql

假设您有一个关系需要以某种方式引用另一个表中的任何(变量)数量的不同项目(通过其键)。如何实现这一目标?

3 个答案:

答案 0 :(得分: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 Question.QuestionID=@QuestionID
GROUP BY Question.QuestionID

答案 1 :(得分: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
--------------------------------------------------

这样,Person 1可以有2个Items_A(1,4)1 Item_B(2),而person 2可以拥有与Person 1相同的Item_A(1)。

我认为这是我能想到的最灵活的方案。

答案 2 :(得分:1)

  1. 您能举个例子吗?也许您的架构可以重构,以便它不需要这样的花哨约束?

  2. 明显:根据需要定义多个约束。

  3. 定义可防止表格中出现不满足关系的行的触发器。

  4. 但我仍然怀疑可以重新定义表结构以简化事情。