2

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

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 到它。

4

2 回答 2

4

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

在此处输入图像描述

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

类别:

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

物品:

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

类别项目:

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

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

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

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

并且由于InnoDB 使用集群,这也会将属于同一类别的项目物理上靠近存储在一起,这可能对上述查询的 I/O 相当有利。

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

于 2013-05-20T01:26:56.943 回答
0

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

于 2014-03-27T01:44:23.233 回答