【问题标题】:Normalization leads to too much queries?规范化导致查询过多?
【发布时间】:2019-06-14 21:08:24
【问题描述】:

设计一:

database design 1 image 更多表。更好的标准化。数据干净/更好地组合在一起。

问题1:如果用户正在注册一个帐户,那会不会做太多查询?

插入播放器 ()...

INSERT INTO player_device ()...

INSERT INTO player_gameprofiledata ()...

INSERT INTO player_personaldata ()...

这是 4 个查询。 更新用户信息可能会再次导致相同数量的查询。

问题 2:将表 player_personaldata 合并到播放器中是不是一个坏主意(如设计 2 中)?

问题3:player和player_device的关系,是1:n还是m:n?


设计2:

database design 2 image 更少的表格,但混合的数据。

区别:

  • player_device 和 player_personaldata 字段位于 player 表中
  • 字段 playername 在表 player 而不是表 player_gameprofiledata 中(简化登录)
  • 无法通过表 player_devic 跟踪当前正在使用的设备

问题 4:即使没有出现严重的数据冗余,是否进行了充分的规范化或糟糕的设计?

【问题讨论】:

标签: database-design database-normalization


【解决方案1】:

您的两个设计都同样标准化。

我通常避免一对一的关系。在您的情况下,它甚至会有点危险,因为 DBMS 发现很难保证玩家和 player_gameprofiledata 之间真正的 1:1 关系。很容易保证 1:{0,1} 关系,即一个玩家不超过一个 player_gameprofiledata。这将通过一个简单的外键来完成。但是为了保证每个玩家都存在一个 player_gameprofiledata ,反之亦然,必须有一个从表 A 到表 B 并返回的外键,这只能通过并非每个 DBMS 都提供的延迟约束来完成。

因此,请保持您的数据库简单。玩家是有玩家名字的玩家,如果数据库只有一个游戏,那么玩家也有一个游戏设置等。一张桌子。

(也有例外,例如对表的不同访问权限或使用它们的不同程序员。所以在我看来:在出于某种原因确实需要时使用 1:1 表,否则避免使用它们。)

问题 1 的答案:别担心。仅在玩家第一次注册时才发生的四个插入并不多。并且更新通常不会影响多个表。但是,在您的第一个设计中,您的表格数量过多。你可以(并且在我看来应该)让它更简单。

对问题 2 的回答:不。合并 1:1 相关表实际上是个好主意。

问题 3 的答案:一名玩家拥有/拥有许多设备。一台设备属于一名玩家。所以它是 1:n。如果您有一个设备表,而 player_device 将链接播放器和设备,则它将是 m:n。这种设计可以帮助避免一个玩家拥有 android 版本 4.4.1 和另一个 4.4.01 的可能错误。所以我建议添加一个设备表。或者,设备是否更重要。还是单纯的信息?您的表格表明您对所有这些设备都非常感兴趣。如果是这样的话,那就彻底地去做。如果没有,那么您只需将当前设备属性再次添加到播放器表就可以了,就像您在第二种方法中所做的那样。 (您可以添加一个 player_device_history 表,每次播放器设备更改时都会填写该表,因此您有历史记录以备不时之需,但该表更像是一个日志记录表,而不是您日常使用所需的实际表.)

问题 4 的答案: 两种设计都是规范化的并且很好。我会选择第二种设计。但是,如果您将来可能希望将此数据库用于多个游戏,那么您应该已经考虑到这一点。

【讨论】:

猜你喜欢
  • 2023-03-06
  • 2017-05-09
  • 2013-11-17
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2015-06-11
相关资源
最近更新 更多