gpt4 book ai didi

mysql - 数据库设计两张表 vs 连接表,哪个更好

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:43 25 4
gpt4 key购买 nike

我有两个表 matchestournaments 具有以下结构,

MATCH
MATCH_ID
PLAYER_ID_1
PLAYER_ID_2
RESULT
TOURNAMENT_ID

TOURNAMENT
TOURNAMENT_ID
NAME
OTHER_DETAILS

一场比赛会有多场比赛

一场比赛可能有也可能没有锦标赛 id

用例:

  • 检索所有匹配项
  • 按锦标赛检索所有比赛

match 表中有 tournament id 好吗?或者我应该为 tournamentmatch 映射创建一个单独的连接表吗?哪个在音量增大时性能好?

最佳答案

TOURNAMENT_ID 与 MATCH 具有 1:M 的关系。它似乎是一个简单的外键。实现外键的标准方法——甚至是可选的外键——是子表上的一列带有外键约束。这将支持您的两个用例。

单独的 table 通常会让人头疼。我说“通常”是因为有些学派厌恶数据库中的 NULL 列;出于实际原因——NULL 会对我们的代码做一些奇怪的事情并且需要争论——以及学术原因——NULL 与关系代数相反。因此,如果您有一个禁止使用空值的数据模型,您将需要一个 TOURNAMENT_MATCH 表来保存作为锦标赛一部分的比赛。它的性能也可能比 MATCH 上的外键列稍差,但除非您有大量数据,否则您不会注意到其中的差异。

有一个连接表(也称为联结表或交集表)的用例,它正在实现多对多关系。假设我们添加第三张 table ,PLAYER。一个玩家可以参加很多锦标赛,而一个锦标赛有很多玩家。经典的 M:N 关系。所以我们可以用一个连接表 REGISTERED_PLAYER 来解决它。它作为 (TOURNAMENT_ID,PLAYER_ID) 的复合键以及 TOURNAMENT 和 PLAYER 的适当外键。


为了完整起见,我将提及来自 Data Vault 建模的链接表。这是数据仓库的有趣建模技术,其中 - 粗略简化警报 - 表被定义为中心(业务和技术 key )和卫星(不可变属性记录)。这种方法允许捕获随时间变化的数据。集线器之间的外键关系通过链接表实现,以支持随时间变化的关系。

Data Vault 以时间敏感的方式处理大量数据有几个好处,但易于理解的物理数据模型不是其中之一。无论如何,find out more .

关于mysql - 数据库设计两张表 vs 连接表,哪个更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57914417/

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