假设我们有一张包含这些标签记录的表格:
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。
答案 0 :(得分:3)
正如其他人已经建议的那样,通过联结表在物理模型中表示多对多关系。我会做腿部工作并为你说明:
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]"
编制索引。