也许,我疯了,最后我忘记了所学的一切,但我对我正在设计的数据库模型有很多疑问。
这是我的问题:
我有一个包含n列的表,其中八列将有三个可能的值:YES,NO,UNKNOWN。
我认为我可以使用带有PK和描述的另一个表,但我不确定是否可以从一个表创建八个外键到同一个表。
我的问题是:
我是否需要第二张表来存储YES,NO和UNKNOWN?是否可以在同一个表中有八个外键?
答案 0 :(得分:1)
我是否需要第二张表来存储YES,NO和UNKNOWN?
不是真的。为什么不使用DBMS提供的“bool”(或“bit”etc ...)类型,其值为TRUE(或1或其他),FALSE(或0)和NULL?
或者,考虑一个简单的INT,其中每个值都记录在案并且对所有客户“熟知”。如果DBMS支持它,则为ENUM(MySQL)。请不要使用字符串作为逻辑上的布尔值或枚举 - 你最终会在许多重复的字符串上浪费空间。
我只考虑单独的表:
是否可以在同一个表中有八个外键?
同一个表可能是八个外键的父端点。同一个表也可能(虽然臭)是8个FK的子端点。
是的,这是可能的。
答案 1 :(得分:1)
你不是疯了。
有一种建模数据的方法,最终会使用充当集线器的表,其他许多表通过FK / PK机制引用这些集线器。该设计被称为“星型模式”。充当集线器的表称为“事实表”。引用它们的表称为“维度表”。还有另一种称为“雪花模式”的设计,其中维度表本身由其他表引用。
您无法设计星型和规范化的架构。它们是两个不同的学科,每个学科都有最佳的适用范围。星型模式适用于数据仓库,数据集市和报告数据库。生成复杂的分析查询结果非常简单。更新星型模式是一种巨大的痛苦。因此,当您进行OLTP时,规范化设计可以更好地工作。
Star模式最初是作为将所谓的“多维建模”移动到SQL数据库世界中的一种方式而开发的。多维建模用于Cognos等数据立方体等结构中。
但是,星型模式的设计目标与您在问题中概述的非常不同。
答案 2 :(得分:0)
毫无疑问,设计中可能有八个外键(但可能有一些RDBMS不允许它)但是我确实想知道你在建模哪个问题域,如果你认为这是溶液
外键描述了一种关系,其中包含外键的表将包含依赖于引用表中记录的记录。要有八个引用来跟踪两个表中记录之间的一对一关系,这似乎有点奇怪。
特别是因为列只能有三个值。表达哪种关系?可以指示引用表中有多少条记录?
如果没有更多细节,我会说你的设计已经破了。
答案 3 :(得分:0)
如你所述,拥有外键是完全可以的。试试吧。
ENUM当然也很好,只要你永远不会有更多的状态来处理(例如“可能”),或者需要移动到可能不支持枚举的不同数据库。