Mysql 将子项中的外键添加到";“超级家长”有没有更好的方式,比如看风景?
我对一个任务有一些不好的感觉,在这个任务中,子孩子应该向“超级家长”获取物理家长ID(外键) 下面是当前的数据库/orm结构 家长->子女1->子女2->子女3->子女4->子女5->子女6 总是一个女人 所以这是一条很长的链条。让我们取一个更好的可读例子: nail->getFingerPart()->getFinger()->getHand()->getHuman()(假设每个fingerPart可以有多个指甲;) 现在,我的任务是在“指甲”、“手指部位”和“手指”(而不仅仅是“手”拥有它)中添加一个人类id列 造成这种情况的主要原因是许多连接可以从人身上获取所有指甲等等。 实体“快捷方式”如human->getNails()看起来也很难看:foreach this->getHands()as hand。。。正手->getFingers()…) 虽然我不认为这会是一个大的性能问题(这不是一个每个ms都很重要的高性能应用程序),但是的,这些连接很烦人,5-6个嵌套循环不会让你爱上代码 但我不知道,只是感觉不对 1.)我想你会在原则中遇到级联删除的问题 2.)看起来你会搞乱这个结构,因为不再有“真理之源”(finger说它属于人类1,hand说它属于人类2)-但是,在我们的特殊情况下,这不会发生,因为你无法改变“人类”。但是,如果这得到了一个共同的行为,以避免加入,它肯定会 3.)在我们的例子中,您可以创建新的手、手指。。。在这里,我们需要在这个更改之后设置人员,所以我们需要修改很多代码(但我想,这不会给涉众留下深刻印象) 这里还有可能发生的其他“冲突”吗 难道没有更好的方法来创建视图吗?Mysql 将子项中的外键添加到";“超级家长”有没有更好的方式,比如看风景?,mysql,database-design,doctrine,Mysql,Database Design,Doctrine,我对一个任务有一些不好的感觉,在这个任务中,子孩子应该向“超级家长”获取物理家长ID(外键) 下面是当前的数据库/orm结构 家长->子女1->子女2->子女3->子女4->子女5->子女6 总是一个女人 所以这是一条很长的链条。让我们取一个更好的可读例子: nail->getFingerPart()->getFinger()->getHand()->getHuman()(假设每个fingerPart可以有多个指甲;) 现在,我的任务是在“指甲”、“手指部位”和“手指”(而不仅仅是“手”拥有它)
然后是HumanView->findAllBy([“human”:1]);要获取所有的钉子(但要使用“真实”的可写实体,而不是只读视图实体)?您需要向数据库模型添加冗余 这总是可能的,而且它提供了优点和缺点。我最近没有使用过它,但我肯定记得在90年代使用过它,当时我们有这么慢的机器,查询在标准化的数据库模型上花费了不可接受的时间 最终,这是一个有成本的技术决策,除非直接影响到底线,否则利益相关者不会在意 专业人士:
- 高速查询
- 简单、简短的查询,代码更少。易于阅读和书写
- 冗余。有很多关于它的文章
- 现在需要对事务执行每一次数据修改,因为它总是包含多个更新/删除
- 许多代码甚至用于简单的数据修改
- 所有开发人员都需要理解这一点,并以正确的方式进行
- 哦。。。一个使用数据库的新应用程序出现了,新团队将对其进行更改。他们知道如何做对吗?你相信他们吗
- 也许您需要编写夜间进程来检查/修复冗余
如果您这样做,请确保您了解所有的缺点,并且您和管理层愿意处理成本。您询问如何向数据库模型中添加冗余 这总是可能的,而且它提供了优点和缺点。我最近没有使用过它,但我肯定记得在90年代使用过它,当时我们有这么慢的机器,查询在标准化的数据库模型上花费了不可接受的时间 最终,这是一个有成本的技术决策,除非直接影响到底线,否则利益相关者不会在意 专业人士:
- 高速查询
- 简单、简短的查询,代码更少。易于阅读和书写
- 冗余。有很多关于它的文章
- 现在需要对事务执行每一次数据修改,因为它总是包含多个更新/删除
- 许多代码甚至用于简单的数据修改
- 所有开发人员都需要理解这一点,并以正确的方式进行
- 哦。。。一个使用数据库的新应用程序出现了,新团队将对其进行更改。他们知道如何做对吗?你相信他们吗
- 也许您需要编写夜间进程来检查/修复冗余
如果您这样做,请确保您了解所有的缺点,并且您和管理层愿意处理这些成本。什么版本的MySQL?我这样问是因为8.0有“递归CTE”,这可能非常有用。可能与MySQL的哪个版本重复?我这样问是因为8.0有“递归CTE”,这可能非常有用