数据库设计:简化多对多

时间:2011-04-09 12:06:22

标签: mysql database innodb database-design

说我有以下表格:

  • person(person_id,name)
  • 种族(ethnicity_id,姓名)
  • person_ethnicity(person_id,ethnicity_id)

这样我就可以通过person表定义ethnicity有0个或更多ethnicityperson来拥有0个或更多个person_ethnicity

现在,假设我有很多这些“种族”类型的表格,我必须与person表格建立多对多的关系。我的桌子数量会快速增长。

有一个这样的表是一个好主意:

  • foo(person_id,other_table_name,other_table_pk)

一个例子:

=================================================
| person_id | other_table_name | other_table_pk |
=================================================
| 1         | ethnicity        | 1              |
-------------------------------------------------

我以这种方式失去了参考完整性,但我认为这会使建模变得更容易。这种方法是一个好主意还是一个可怕的,可怕的想法?

(另外,我上面描述的方法是否有正确的名称?)

4 个答案:

答案 0 :(得分:1)

我认为没有必要。很多表格都没有问题,而且你通过这样做会破坏很多“规则”。如果你需要,可以选择多对多。

以这种方式使用它你应该做各种棘手的事情。此外,您不能对外键(约束)和其他大量问题做任何事情。为了什么? “少桌”。我认为没有任何优势:D

不要做我的建议:D

答案 1 :(得分:1)

既然你从理论的角度提问,我会给你一个相同的答案。

您的情况与标签系统非常相似。幸运的是,MySQL社区提供了一篇关于TagSchema via Forge的优秀wiki文章。

此外,您应该考虑搜索SO以查找类似的问题,因为它是askedasked以及asked。其中一些实际上提供了有趣的洞察力。特别是What tag schema(s) are the most efficient/effective?以及有关Collection Tags Tag Sets的回复。

答案 2 :(得分:0)

如果你的模型中有许多多对多关系,比如你的种族例子,你别无选择,只能按照关系习惯用法的方式对它们进行正确建模。

我不认为你的设计是个好主意。绑定到表名和列名不是用Java完成的;我不了解其他语言。

拿一把铁锹;开始工作。使用关系惯用法对问题进行建模,或者找到其他内容。在您的情况下,像对象或图形数据库这样的NoSQL解决方案可能更好。

答案 3 :(得分:0)

你的解决方案会很快炸毁你的“foo”表。

想象你有1000个人。然后每个人至少有2个种族。

然后你有一张国籍表,每个人也至少有1.5个国籍。

然后是一个性别,每个人至少有1个性别,总共最多4500个条目。

现在可以说你的人员表增加到大约50000人。

这将使您的“foo”表中已有225000个条目。

既然你已经填满了你的桌子,你就可以查询加入foo且只有种族的人来获得所有人的种族,并且你的服务器将长时间工作,因为你加入一张50000桌子和一张225000桌子并且在结束加入一张小桌子。

所以我希望我明确表示为什么制作这样的布局不是一个好主意