数据库设计,多个M-M表还是只有一个?

时间:2017-02-08 16:55:53

标签: database database-design many-to-many

今天我正在为我的潜在个人项目设计一个数据库。由于我无法确定什么是更好的选择,我问我的老师数据库,不幸的是他无法告诉我哪两个选项比另一个更好以及为什么。

我为虚拟数据生成器设计了数据库。由于我想生成多语言数据,我想到了这些表。 (但它简化了表格。)

(第一个和最后一个)名称:id,name
街道:ID,名称
语言:id,name

每个names.name和streets.name都来自一种语言,有时一个名称可以有多个来源(例如:Nick是荷兰语作为英文名称)。
每种语言都有多个名称和街道。

这两条规则导致多对多关系。目前我只有两张桌子,但我知道我会得到10到20张这样的桌子 一个人这样做的常规方法是制作10到20个多对多关系表 我想出的另一个想法是只有一个“多对多”表,第三列指定了id与哪个表相关。

目前我已经在我的另一台PC上进行了设计,所以我会在晚餐后(2小时左右)将我的想法更新后来更新。

哪种想法更好,为什么?

使项目理念更清晰:
为项目创建良好且足够逼真的工作数据始终是一件麻烦事。此应用程序将为您生成此数据并返回所需的SQL,因此您只需运行查询。

用户访问该网站以获取数据。他陈述了他的表名,他的列名,然后他可以将列名链接到数据类型,想到:
 *名字
 *姓氏
 *电子邮件地址(将从该人的姓名中随机生成)
 *地址详情(街道,房屋号码,邮政编码,地点,国家)
 *更多

然后,在将列与类型链接后,用户可以设置他想要创建的行数。然后,应用程序将随机选择一个国家/地区,并根据其所在的国家/地区生成逼真的数据。

1 个答案:

答案 0 :(得分:1)

这实际上是一个很好的问题。这种事情导致了数据库设计中的真正问题,并且存在真正的权衡。我不知道你正在使用什么rdbms但是......

基本上你有四个选择,所有选择都有严重的缺点:
1。一个具有检查约束的M-M表,除了语言之外只能填写一个fkey,每个潜在表只能填充一列。伊克....
2。每个关系一个M-M表。这使得随着时间的推移很难管理,特别是如果你需要在某些时候将某些东西从int更改为bigint 3. 一个具有多态关系的M-M表。当你这样做时,你会失去很多参考完整性检查,并使其安全,有趣的编码(和测试!)触发器。
4. 仔细查看rdbms中的高级功能以获取解决方案。例如,在postgresql中,这可以通过表继承来解决。缺点是你失去了便携性并最终进入了高级领域。

不幸的是,没有一个明确的答案。您需要仔细考虑权衡并确定对您的项目有意义的内容。如果我只是使用一个RDBMS,我会做最后一个。但如果没有,我可能会为每个关系做一个表,并专注于工具来管理出现的问题。但前者的偏好是关于我的知识水平和信心,后者更多是个人意见。

所以我希望这可以帮助你看看权衡并选择适合你的方式。