草庐IT

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

coder 2023-10-17 原文

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

结构的简化分解如下:

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

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

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

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/

有关mysql - 我应该将所有 MySQL 表相互关联吗?的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  3. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  4. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  5. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  6. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  7. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  10. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

随机推荐