【发布时间】:2017-08-24 09:00:39
【问题描述】:
我有一张表说Table1,它有以下列
1. Id
2. Name
3. TransportModeId
4. ParkingId
5. ActivityId
第 3、4、5 列是外键,三列都是简单的列表,包含以下列
1. Id
2. Item
为简单起见,我展示了 3 个表,否则我的实际架构包含近 25 个列表表。
最佳实践应该是什么
选项 1。 将所有列表分开,这将创建 25 个表,但另一方面我将拥有一个干净的模块化架构
选项 2。
使用自联接创建一个表并添加该表中的所有项目,其中ParentId null 将表示表的名称,并且如上所述在其他表中可以有多个引用,并且必须以某种形式保存通用模块
谢谢
【问题讨论】:
-
选项 1 是唯一可行的解决方案。选项 2 在 30 年前文件句柄和资源有限时可能有意义。查询这样的结构将是地狱。保持干净,不要担心数据库中有多少表。
-
不确定是不是重复的,但你也应该read this post.
-
我认为在选项 2 中,您描述的是 EAV 设计,每个数据库建模人员最终都会提出这种设计,但希望不会实际使用。这是一篇关于 EAV 的有趣文章:simple-talk.com/sql/learn-sql-server/…
-
@Nick 非常翔实的文章,它使我的概念变得清晰,但我仍然更关心编码方面,对于具有 Id 的相同数据类型,即使在这种情况下,我也必须为几乎 25 个表重复相同的代码选项 1是最好的方法
-
我想我理解得更好——你说的不是 EAV,而是“一张桌子统治他们”的模式。有时没有完美的设计,你只需要选择一个并接受它。只要您考虑所有缺点,就可以拥有一个主查找表。这是另一篇 Celko 文章,它将帮助您了解缺点(只是 One True Lookup Table 位):simple-talk.com/sql/t-sql-programming/look-up-tables-in-sql。真正的挑战是了解您的数据和需求在 12 个月、3 年、6 年之后的位置。
标签: sql-server database list database-design database-schema