Database design 数据库设计:表还是列?
2个快速问题: 我已经尽了最大的努力来学习规范化表单,但是对于这种特定情况我并不确定Database design 数据库设计:表还是列?,database-design,Database Design,2个快速问题: 我已经尽了最大的努力来学习规范化表单,但是对于这种特定情况我并不确定 我有一件事 一个事件有许多实例 实例有:食物、人员、成本、评估、位置等 食物、人员、成本等应该各自有自己的表还是只是实例表中的列(BLOB)?我没有理由认为它们每个都需要一个完整的表,因为它们只属于一个实例,不会被共享。然而,我不知道未来是否会给我理由让他们成为他们自己的人,所以还是把他们当作自己的人来对待好吗 其次,如果所有这些都应该是它们自己的表,那么也存储事件外键是否有用?如果我想调用某个事件的每个食物列
其次,如果所有这些都应该是它们自己的表,那么也存储事件外键是否有用?如果我想调用某个事件的每个食物列表,而不考虑实例,或者我只是从一个事件中获取所有实例,然后调用每个实例的信息。如果我预计会发生这种情况,那么这是否足以让我添加关键点,或者这是一个糟糕的计划呢?在你走下这条路并后悔以后的决定之前,不妨现在就计划一下未来。最好将实例项(食物、人员、成本等)存储在单独的表中。Instance->Instance项是一个多对多关系,您需要在对象表之间建立一些链接表来允许这种多对多关系
Event | EventID
Instance | InstanceID, EventID
InstanceFood | InstanceID, FoodID
InstancePerson | InstanceID, PersonID
...
Food | FoodID, FoodName
Person | PersonID, PersonName
对于链接表,primaryKey是InstanceID和其他id值的组合。使用此设置,无需在对象(食物、人)表中存储事件ID。如果您想知道某个特定的人与哪些事件相关,只需将person与Instance person和Instance结合起来,即可获得所有相关的EventID。在您开始之前,不妨在此时此地规划未来,稍后再后悔您的决定。最好将实例项(食物、人员、成本等)存储在单独的表中。Instance->Instance项是一个多对多关系,您需要在对象表之间建立一些链接表来允许这种多对多关系
Event | EventID
Instance | InstanceID, EventID
InstanceFood | InstanceID, FoodID
InstancePerson | InstanceID, PersonID
...
Food | FoodID, FoodName
Person | PersonID, PersonName
对于链接表,primaryKey是InstanceID和其他id值的组合。使用此设置,无需在对象(食物、人)表中存储事件ID。如果您想找出特定人员与哪些事件关联,只需将人员与实例人员和实例关联起来,即可获得所有关联的事件ID。您的模型未指定。
事件
“有”成本是什么意思?它是以美分表示的一个总数吗?属于数值成本列的。它是几种收费产品或服务的分项说明吗?然后它必须进入一个单独的表中,因为这是实现1:n关系的唯一合理方法。同样地,评估
是1-10分制的单一分数吗?专栏。这是一份包含多个(甚至,上帝保佑,数量可变)问答职位的结构化问卷吗?桌子只是人数重要吗?专栏。相关人员的身份重要吗?桌子
至于2,如果您有包含1:n数据的关联表,那么实际上没有办法让它们通过外键引用“拥有”记录。例如,如果您确实需要一个表来模拟实例
和人员
之间的1:n关系,那么人员
必须有一个实例ID
列。您的模型未指定。事件
“有”成本是什么意思?它是以美分表示的一个总数吗?属于数值成本列的。它是几种收费产品或服务的分项说明吗?然后它必须进入一个单独的表中,因为这是实现1:n关系的唯一合理方法。同样地,评估
是1-10分制的单一分数吗?专栏。这是一份包含多个(甚至,上帝保佑,数量可变)问答职位的结构化问卷吗?桌子只是人数重要吗?专栏。相关人员的身份重要吗?桌子
至于2,如果您有包含1:n数据的关联表,那么实际上没有办法让它们通过外键引用“拥有”记录。例如,如果您确实需要一个表来模拟实例
和人员
之间的1:n关系,那么人员
必须有一个实例ID
列。谢谢!我想你对桌子的看法是对的,但我只是不确定。但是,我可能仍然会使用一对多,只是因为即使有人使用了某个实例项中的所有信息,我希望它是一个新项(防止覆盖)。这是一个合理的策略吗?@Jdewzy如果person或food类型的单个实体只与instance类型的单个实体关联,那么您也可以安全地删除链接表。只需将InstanceID添加到食物、人表中即可。这对我来说似乎是合理的,但我不敢说这是不是一个好主意,因为我没有像你一样完全意识到整个问题。不,这真的很有用。谢谢谢谢我想你对桌子的看法是对的,但我只是不确定。但是,我可能仍然会使用一对多,只是因为即使有人使用了某个实例项中的所有信息,我希望它是一个新项(防止覆盖)。这是一个合理的策略吗?@Jdewzy如果person或food类型的单个实体只与instance类型的单个实体关联,那么您也可以安全地删除链接表。只需将InstanceID添加到食物、人表中即可。这对我来说似乎是合理的,但我很犹豫说这是否是个好主意,因为我还没有完全意识到这一点