2017-04-21 85 views
0

这些是我的表格,我创建了一个tbl_relation,其中data_idtbl_datatag_idtbl_tagsdata_id可以有多少个tag_ids以一对多关系设计数据库

例如在以下情况下: 约翰与食物,苹果,橙子有关。 Linus与食物,马铃薯有关。

这是在速度和存储方面做的正确方法吗?因为我的tbl_tagstbl_data可以有至少1百万个条目,并且tbl_data中的name可以与至少5个tag_name相关联。

tbl_tags 
+----+--------+ 
| id | name | 
+----+--------+ 
| 1 | food | 
+----+--------+ 
| 2 | apple | 
+----+--------+ 
| 3 | orange | 
+----+--------+ 
| 4 | potato | 
+----+--------+ 
| 5 | fruit | 
+----+--------+ 

tbl_data 
+----+--------+ 
| id | name | 
+----+--------+ 
| 1 | John | 
+----+--------+ 
| 2 | Linus | 
+----+--------+ 
| 3 | Bill | 
+----+--------+ 
| 4 | Steve | 
+----+--------+ 
| 5 | Dennis | 
+----+--------+ 

tbl_relation 
+---------+--------+ 
| data_id | tag_id | 
+---------+--------+ 
| 1  | 1  | 
+---------+--------+ 
| 1  | 2  | 
+---------+--------+ 
| 1  | 3  | 
+---------+--------+ 
| 2  | 1  | 
+---------+--------+ 
| 2  | 4  | 
+---------+--------+ 
+0

这看起来是一种存储两种类型数据及其之间关系的规范方法。您的挑战在于创建正确的索引,以便可以高效地完成联接。 –

+0

+是的,这确实是最好的方法 – Milney

+0

A 1:许多关系最好用一个表中的额外列来完成,而不是通过一个额外的表。 –

回答

0

这是什么?

标题说“1对多”。在这种情况下,tags应该有一列说明哪个人(data_id)与该标签有关。

也许Sam赞好applepotatokiwi?也就是说,文本暗示可能有很多:很多。在这种情况下,您需要一个2列表,基本上就像您所描述的那样。这里有my tips这样的表的优化设计。这些提示解决了您的速度和空间问题。

0

这似乎是一个多对多的关系,因为tbl_data_id可以与多个tbl_tags_id关联,反之亦然(看到tbl_relation中的条目)。 如果是这种情况,您的方法看起来非常标准,正常形式。

一个推荐是在你的tbl_relation表上创建外键约束。