【发布时间】: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 元数据或不需要)。然后优化存储限制,一旦你可以证明它们存在仍然小到可以驻留在内存中)。
-
如果这是
users和items之间的多对多映射,请参阅此优化:mysql.rjweb.org/doc.php/…
标签: mysql sql database database-design