gpt4 book ai didi

database-design - 数据库设计::2 个参与者事件中的规范化::加入表或 2 列?

转载 作者:行者123 更新时间:2023-12-04 23:30:17 26 4
gpt4 key购买 nike

编辑 :更新广义问题以反射(reflect)实际领域:曲棍球运动。

实际事件是比赛日程,参与者是团队。

球队是最终的“所有者”(即当球队被删除时,任何相关的预定比赛、结果、球员和球员统计数据也应如此)。

到目前为止,该线程中讨论的问题涵盖了将事件合并为具有 2 列(team1、team2)的单行或拆分为连接表的决定。到目前为止的共识是:保持 2 列方法。然而,鉴于最初的问题适用于通用事件而不是具有相关结果的预定比赛,方法可能会发生变化(例如,有些人可能会说比赛日程应该记录两个日程信息[日期,时间,地点,队]和比赛结果/结果信息(比分、胜负平局、罚球时间等),因此应该添加一个连接表来生成唯一的游戏 ID)。

到目前为止的 react 非常好;--) 将标记为已回答,等待任何更新。谢谢大家!

原问题:

对如何解决这个问题感到困惑。

处理事件(发生在给定日期和地点)的规范化方法是什么,其中始终只有 2 个参与者?

非规范化方法是创建一个事件表:

1) eventID PK (autonum)
2)参与者表中的两列,参与者1和参与者2,PK(自主)。

虽然这种方法确实在单个表记录中整合了事件创建(没有连接表来创建 eventID),但这种设计的一个问题是,从技术上讲,参与者应该是等式的拥有方;即删除参与者时,应删除任何相关事件,因为不允许孤立事件。

另一种方法是连接表,在我看来,它会生成一个唯一的 eventID 以及日期、时间和位置。修改后的事件表将包含连接表 eventID 和 2 个单独的行,每个参与者一个。通过这种方法,我可以轻松地将 FK 添加到参与者 ID(参与者表中的 PK)的事件表中,从而具有适当的约束。

你会如何处理这个问题?我应该指出,我们在生产中使用非规范化设计已有几年没有问题(数据约束被推到代码级别),但我们正在从头(数据库)向上(代码)寻找重新架构,因此问题;--)

最佳答案

为什么你认为这没有正常化?两个参与者 ID 都以一种使其成为 3NF 的方式依赖于事件(取决于 key 、整个 key 以及除了 key 之外什么都没有,所以帮帮我,Codd)。

但是,如果日期和位置也取决于事件 ID,它们也应该放在这个表中(位置可能是另一个表的外键查找,类似于参与者)。类似于:

Events:
EventId primary key
Date
LocationId references Locations(LocationId)
ParticipantOneId references Participants(ParticipantId)
ParticipantTwoId references Participants(ParticipantId)
Locations:
LocationId primary key
<<Other location stuff>>
Participants:
ParticipantId primary key
<<Other participant stuff>>

仅仅因为你有一些看起来像数组的东西,它不会自动违反 3NF,它只是一个应该查看的警告标志。

现在,如果您曾经发现一个可能有 0、1、3 或更多参与者的事件,那么您会想要重新设计模式。

在那之前,YAGNI。

关于database-design - 数据库设计::2 个参与者事件中的规范化::加入表或 2 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6068635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com