如何在MySQL中为一行分配多个ID?

时间:2013-05-19 22:26:17

标签: mysql database-design

假设我们有一张包含这些标签记录的表格:

Category   ID

apples     1
orange     2

然后我们有另一张表格

Data catID
...    1

通过这个设置我们只能在苹果页面中检索这一行,分配苹果和苹果的正确方法是什么?橙色到那一排?我是否需要将catID字段从整数更改为varchar,只需添加第二个ID,使值为1,2,然后将查询编辑为:

 select * from table where catID LIKE '%1%' 
 select * from table where catID LIKE '%2%'

而不是

  select * from table where catID='1'
  select * from table where catID='2'

我不确定这是否正确?有人能说出你是怎么做到的吗?基本上,我不想复制整行,只是为了添加另一个id。

2 个答案:

答案 0 :(得分:3)

正如其他人已经建议的那样,通过联结表在物理模型中表示多对多关系。我会做腿部工作并为你说明:

enter image description here

CATEGORY_ITEM是联结表。它有一个复合PK,由从其他两个表迁移的FK组成。示例数据......

<强> CATEGORY:

CATEGORY_ID CATEGORY
----------- --------
1           Apple
2           Orange

<强>项:

ITEM_ID     NAME
-------     ----
1           Foo
2           Bar

<强> CATEGORY_ITEM:

CATEGORY_ID ITEM_ID
----------- -------
1           1
2           1
1           2

以上意思是:“Foo既是Apple又是Orange,Bar只是Apple”

PK确保任何给定的类别和项目组合不能存在多次。该类别要么连接到不是的项目 - 它不能连接多次。

由于您主要想要搜索给定类别的项目,因此PK中的字段顺序为{CATEGORY_ID,ITEM_ID},因此基础索引可以满足该查询。确切解释为什么超出了这个范围 - 如果您有兴趣,我热烈推荐阅读Use The Index, Luke!

InnoDB uses clustering开始,这也会将属于同一类别的项目物理地靠近在一起,这可能对上述查询的I / O非常有用。

(如果您想查询给定项目的类别,则需要翻转索引中字段的顺序。)

答案 1 :(得分:0)

您是否意识到索引一行的两个ID是实际项目中双向关系管理的典型应用?我们需要一个更智能的DB解决方案而不是两行/联结表解决方案。在MongoDB中,您可以将"low_id:hight_id"设为字段"_id"和字段"uids_low_high",并为"uids_low_high"搜索"$in:[$id]"编制索引。