我有很多表使用Lookup/Enum引用的大部分列值。 例如:
Person Table - personID | RaceCode | HairColorCode | HairStyleCode | TeethConditionCode
Location Table - LocationID | SizeCode | ExteriorColorCode |条件代码
像种族,大小,颜色,条件等的东西只是对代码查找表的外键引用。这个代码表有其他领域,但对我的问题并不重要。该数据库用于SaaS应用程序,这意味着每个客户端都可以拥有自己的颜色,种族,条件等列表。有些代码是静态的,客户端无法更改。
有1个代码表或2种类型的代码表(DynamicCodeTable用于客户定义的和StaticCodeTable用于那些更改)还是应该为每个代码类型(RaceCodeTable,HairColorTable,Condition,等等)?
我最担心的是所有的sql连接。我正在使用的Person表有20多个这些代码属性。加入20个不同的表时,性能是否有差异?VS连接到同一个表20次?拥有多个表格意味着每个表格会更小,查找'应该'需要更少的时间。但有一张桌子也可以很快。有什么建议么?数据库设计 - 多查找/枚举表或一个大表?
回答
不知道更多关于应用程序或需求我建议每个代码类型都有一个表。国际海事组织的数据库设计将更加清晰,并自我记录每种类型的代码都有外键。
我犯了一个错误,认为在重新设计我们非常宽的表格时,所有这些查找表都是一个好主意。如此多的灵活性等,但最终难以编码,无法导航,这只是一个痛苦的屁股。
那么我学到了什么?
- 对于静态值,只需使用枚举 - 它会更快,更方便。这个决定必须取决于有多少其他表可能引用同一个变量。
- 坚持使用更少的查找表,而不是创建尽可能多的,你可以想到的。 JOINs要慢得多。
- 帮助你自己导航,设计数据库视图。它会让你的生活变得更轻松。
- 作为一种奖励,如果您不希望客户触及某些表格(即静态列表)或触摸枚举列值,则可以使用MySQL(例如)精细的权限来禁用对某些列的更改在某些表格中。很多人没有意识到这些权限可以得到多么灵活。
存在潜在的性能差异。
只有2行的表格为这两个小行占用了缓存中的大量空间。
如果在单个表中有很多查找值,则可以将这些值更加密集地打包到缓存中。
在主题为“One True Lookup Table”(缩写为OTLT)的主题下,本主题已经过去十五年的详细讨论。这种方法的优点跳到了数据库新手。随着时间的推移会出现弊端。看到这些链接,OTLT缺点:
- http://tonyandrews.blogspot.com/2004/10/otlt-and-eav-two-big-design-mistakes.html
- http://web.archive.org/web/20100130062850/http://www.dbazine.com/ofinterest/oi-articles/celko22
OTLT
或者search找到更多的讨论。
如果您为它们创建了许多查找表以及许多维护屏幕,您可以创建一个视图来模拟OTLT,方法是创建一个巨大的UNION,其中包含每个代码,每个描述以及表的名称,描述对被存储。 如果您知道自己在做什么,可以使用半自动方法生成这样的联合。我会想象半自动方法可以让你为数百个查找表建立一个维护屏幕,然后在该屏幕和表格之间插入一些逻辑,以便在正确的表格中插入一个新代码。
至于让用户介绍新代码TYPES,而不仅仅是新代码VALUES,那就打开了一大堆蠕虫。请参阅上面讨论EAV的文章。这非常诱人,因为它允许用户设计自己的基础数据结构。如果你忽略了表现,这一段时间运作良好。您无需从用户或主题专家那里学习数据结构,即可获得完美的通用数据库。
当它发生真正的悲痛时,当你试图将数据当作一个综合数据库使用时,而不仅仅是对数据的不连贯的意见大杂烩。此时,当您的客户期望生成日常报告时,您将进入一些严肃的数据考古。祝你好运。
(Editted为“数据挖掘”更改为“数据考古”)
- 1. 数据库查找表枚举或类似
- 2. 数据库设计 - 一个链接表或多个链接表?
- 3. 枚举或表?
- 4. 将多个列表枚举值写入另一个枚举
- 5. 数据库设计 - 查找表
- 6. 枚举与查找表
- 7. 使用SQLAlchemy枚举数据库中的查找表?
- 8. 枚举VS查找表VS枚举反射VS State模式
- 9. C#枚举和数据库表
- 10. 数据库设计:大表vs查询数据中每一行的实体表
- 11. 查找()与列表上的枚举
- 12. 数据库设计,在同一个表
- 13. 设计枚举
- 14. 数据库设计问题 - 字段或新表格+一对多
- 15. 自动生成枚举查找表
- 16. 数据库设计 - 一个表中有许多字段,许多表中有一个字段或抽象表?
- 17. MySQL数据库设计 - 存储图像 - 单表或多表
- 18. 模型设计作为数据库表或多维列表?
- 19. 数据库设计和大表?
- 20. 枚举数据库中的DB或NO枚举
- 21. Oracle数据库设计视图或表?
- 22. 多用表的数据库设计
- 23. 一个大事件基于表或多个表?蜂巢表设计考虑
- 24. Android开发:在设计数据库时有多个表或一张巨大的单表吗?
- 25. 大型网站 - 多个数据库或多个表?
- 26. 多维枚举Array列表
- 27. 正确的大型枚举设计
- 28. 数据库设计 - 列在一个表中参考两个表
- 29. 一个单一的大表或许多小的表在MySQL数据库实现
- 30. 数百个表的数据库设计
我抱怨这一点:如果你只使用枚举,那么他们只是你的应用程序的一部分。这意味着1)每次查找值中的某些内容发生更改时,您需要发布新版本; 2)您无法在数据库中强制执行完整性(或者您必须用杂乱的CHECK约束来“克隆”自己的方式)。因此,我会争论使用查找表查找所有查找值,而不仅仅是真/假字段。 – 2009-05-18 04:55:42
或者定义你的查询表,并具有正常的参照完整性,但是从数据库生成你的枚举定义。这样你对枚举进行编程,并且它们与数据库匹配。 – GalacticCowboy 2009-05-18 12:09:22