【问题标题】:DB design little or too much dataDB设计的数据少或多
【发布时间】:2021-07-12 08:23:34
【问题描述】:

我目前正在做一个使用 MySQL 的小项目。但是我在数据库设计上苦苦挣扎。目前我提出了两种设计,一种存储更多数据,但实际上是我想要的方式,但是这种方式使得处理数据变得非常困难。另一种方式是我认为更基本,简化了很多事情,但存储的数据更少。

设计 1

示例数据项表

id description time_created
1 Car 2021-04-17 17:30:00
2 Bike 2021-04-17 17:30:00

user_items 表示例数据

id user_id item_id time_achieved
1 1 1 2021-04-17 17:30:04
2 1 1 2021-04-17 17:30:03
3 1 1 2021-04-17 17:30:17
4 1 1 2021-04-17 17:30:22
5 1 1 2021-04-17 17:30:34
6 1 2 2021-04-17 17:30:42
7 1 2 2021-04-17 17:30:54

设计 2

示例数据项表

id description time_created
1 Car 2021-04-17 17:30:00
2 Bike 2021-04-17 17:30:00

user_items 表示例数据

id user_id item_id count
1 1 1 5
2 1 2 2

基本上我们有可以是任何东西的项目,它们包含一个描述来指定它们实际上是什么。用户可以收集物品(很多)。这些存储在 user_items 表中,其中包含用户和项目表的 FK user_id 和 item_id。为简单起见,省略了 users 表。

如您所见,设计 1 为 user_items 表存储了更多行,这允许我们为用户实现的每个项目添加更多信息(time_achieved 等)。然而,这会导致更多的行,并且可能更难查询。另一方面,设计 2 只是添加了一个计数列来确定用户拥有多少项目,但这非常有限,因为我们无法为每个 user_item 添加更多数据(达到的时间......)。

我不确定设计 1 是否正确且唯一的设计是为了实现我们想要实现的目标。基本上我们真的想为每个 user_item 存储额外的元数据,但我只是不知道这是否是正确的设计,因为它很快就会填满数据库。是否有人对存储比设计 1 更少的数据但仍允许为每个 user_item 添加更多信息的替代设计提出建议/想法?

提前致谢。

【问题讨论】:

  • 这是过早的优化。选择存储您需要的数据的设计(您需要 time_achieved 元数据或不需要)。然后优化存储限制,一旦你可以证明它们存在仍然小到可以驻留在内存中)。
  • 如果这是usersitems 之间的多对多映射,请参阅此优化:mysql.rjweb.org/doc.php/…

标签: mysql sql database database-design


【解决方案1】:

对于存储比设计 1 更少的数据但仍允许为每个 user_item 添加更多信息的替代设计,是否有人有建议/想法?

设计 1 应该可以工作。

这种设计也可以,但会很快填满,效率更高。 id, item_id,Item_des,Item_qty,user_id,username,time_created 全部在一张表中。 有些值会重复。

【讨论】:

  • 在 user_items 表中重复用户名和 ItemDescription 是一个直接愚蠢的想法。这将是一个事务 (OLTP) 数据库,而不是一个分析 (OLAP) 数据库,没有合理的理由去规范化。此外,重复存储这些字符串可能会增加而不是减少存储空间。
  • 问题是“有一个替代设计的建议/想法,它存储的数据比设计 1 少,但仍允许为每个 user_item 添加更多信息?”,无论 OLAP 还是 OLTP,用户必须确定这对他们来说是最好的。
  • 我已经指定设计 1 可以工作。有什么问题吗?
猜你喜欢
  • 2013-12-28
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
相关资源
最近更新 更多