同一个表的八个外键

时间:2012-09-17 14:46:33

标签: database-design

也许,我疯了,最后我忘记了所学的一切,但我对我正在设计的数据库模型有很多疑问。

这是我的问题:

我有一个包含n列的表,其中八列将有三个可能的值:YES,NO,UNKNOWN。

我认为我可以使用带有PK和描述的另一个表,但我不确定是否可以从一个表创建八个外键到同一个表。

我的问题是:

我是否需要第二张表来存储YES,NO和UNKNOWN?是否可以在同一个表中有八个外键?

4 个答案:

答案 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当然也很好,只要你永远不会有更多的状态来处理(例如“可能”),或者需要移动到可能不支持枚举的不同数据库。