今天我正在为我的潜在个人项目设计一个数据库。由于我无法确定什么是更好的选择,我问我的老师数据库,不幸的是他无法告诉我哪两个选项比另一个更好以及为什么。
我为虚拟数据生成器设计了数据库。由于我想生成多语言数据,我想到了这些表。 (但它简化了表格。)
(第一个和最后一个)名称:id,name
街道:ID,名称
语言:id,name
每个names.name和streets.name都来自一种语言,有时一个名称可以有多个来源(例如:Nick是荷兰语作为英文名称)。
每种语言都有多个名称和街道。
这两条规则导致多对多关系。目前我只有两张桌子,但我知道我会得到10到20张这样的桌子 一个人这样做的常规方法是制作10到20个多对多关系表 我想出的另一个想法是只有一个“多对多”表,第三列指定了id与哪个表相关。
目前我已经在我的另一台PC上进行了设计,所以我会在晚餐后(2小时左右)将我的想法更新后来更新。
哪种想法更好,为什么?
使项目理念更清晰:
为项目创建良好且足够逼真的工作数据始终是一件麻烦事。此应用程序将为您生成此数据并返回所需的SQL,因此您只需运行查询。
用户访问该网站以获取数据。他陈述了他的表名,他的列名,然后他可以将列名链接到数据类型,想到:
*名字
*姓氏
*电子邮件地址(将从该人的姓名中随机生成)
*地址详情(街道,房屋号码,邮政编码,地点,国家)
*更多
然后,在将列与类型链接后,用户可以设置他想要创建的行数。然后,应用程序将随机选择一个国家/地区,并根据其所在的国家/地区生成逼真的数据。
答案 0 :(得分:1)
这实际上是一个很好的问题。这种事情导致了数据库设计中的真正问题,并且存在真正的权衡。我不知道你正在使用什么rdbms但是......
基本上你有四个选择,所有选择都有严重的缺点:
1。一个具有检查约束的M-M表,除了语言之外只能填写一个fkey,每个潜在表只能填充一列。伊克....
2。每个关系一个M-M表。这使得随着时间的推移很难管理,特别是如果你需要在某些时候将某些东西从int更改为bigint
3. 一个具有多态关系的M-M表。当你这样做时,你会失去很多参考完整性检查,并使其安全,有趣的编码(和测试!)触发器。
4. 仔细查看rdbms中的高级功能以获取解决方案。例如,在postgresql
中,这可以通过表继承来解决。缺点是你失去了便携性并最终进入了高级领域。
不幸的是,没有一个明确的答案。您需要仔细考虑权衡并确定对您的项目有意义的内容。如果我只是使用一个RDBMS,我会做最后一个。但如果没有,我可能会为每个关系做一个表,并专注于工具来管理出现的问题。但前者的偏好是关于我的知识水平和信心,后者更多是个人意见。
所以我希望这可以帮助你看看权衡并选择适合你的方式。