gpt4 book ai didi

mysql - 我应该将所有 MySQL 表相互关联吗?

转载 作者:可可西里 更新时间:2023-11-01 07:57:12 26 4
gpt4 key购买 nike

我正在从事一个个人项目,用于对各种项目进行计时,但我不确定构建数据库的最佳方式。

结构的简化分解如下:

  • 每个客户可以有多个报告。
  • 每个报告可以有多个行项目。
  • 每个订单项可以有多个时间记录。

最终会有更多的关系,但这是应用程序的基础。如您所见,每个项目都以一对多的关系与其下方的项目相关。

我的问题是,我应该将每个表与其上方的每个“父”表相关联吗?像这样:

clients
id

reports
id
client_id

line_items
id
report_id
client_id

time_records
id
report_id
line_item_id
client_id

随着向下级联,每个新表中都会添加越来越多的外键。

我最初的 react 是这不是正确的做法,但我很想听听第二(和第三!)意见。

最佳答案

这样做的好处是您可以检查所有时间记录,例如,一个特定的客户 ID,而无需加入。但实际上,没有必要。您所需要的只是将引用存储到一个“级别”,可以这么说。以下是从“客户”角度出发的一些示例:

获取特定客户的报告:(简单;与您建议的当前架构相同)

SELECT * FROM `reports`
WHERE `client_id` = ?;

获取特定客户的订单项:(新架构;表中不需要“client_id”)

SELECT `line_items`.* FROM `line_items`
JOIN `reports` ON `reports`.`id` = `line_items`.`id`
JOIN `clients` ON `clients`.`id` = `reports`.`client_id`
WHERE `clients`.`id` = ?;

获取特定客户的时间条目:(新架构;表中不需要“client_id”或“report_id”)

SELECT `time_records`.* FROM `time_records`
JOIN `line_items` ON `line_items`.`id` = `time_records`.`line_item_id`
JOIN `reports` ON `reports`.`id` = `line_items`.`id`
JOIN `clients` ON `clients`.`id` = `reports`.`client_id`
WHERE `client_id` = ?;

因此,修改后的架构将是:

clients
id

reports
id
client_id

line_items
id
report_id

time_records
id
line_item_id

编辑:

此外,我会考虑使用 View 来简化查询(我假设您会经常使用它们),肯定会在连接列上创建索引,并利用外键引用进行规范化(仅限 InnoDB)。

关于mysql - 我应该将所有 MySQL 表相互关联吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8365570/

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