说我有以下表格:
这样我就可以通过person
表定义ethnicity
有0个或更多ethnicity
和person
来拥有0个或更多个person_ethnicity
。
现在,假设我有很多这些“种族”类型的表格,我必须与person
表格建立多对多的关系。我的桌子数量会快速增长。
有一个这样的表是一个好主意:
一个例子:
=================================================
| person_id | other_table_name | other_table_pk |
=================================================
| 1 | ethnicity | 1 |
-------------------------------------------------
我以这种方式失去了参考完整性,但我认为这会使建模变得更容易。这种方法是一个好主意还是一个可怕的,可怕的想法?
(另外,我上面描述的方法是否有正确的名称?)
答案 0 :(得分:1)
我认为没有必要。很多表格都没有问题,而且你通过这样做会破坏很多“规则”。如果你需要,可以选择多对多。
以这种方式使用它你应该做各种棘手的事情。此外,您不能对外键(约束)和其他大量问题做任何事情。为了什么? “少桌”。我认为没有任何优势:D
不要做我的建议:D
答案 1 :(得分:1)
既然你从理论的角度提问,我会给你一个相同的答案。
您的情况与标签系统非常相似。幸运的是,MySQL社区提供了一篇关于TagSchema via Forge的优秀wiki文章。
此外,您应该考虑搜索SO以查找类似的问题,因为它是asked和asked以及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桌子并且在结束加入一张小桌子。
所以我希望我明确表示为什么制作这样的布局不是一个好主意