【问题标题】:Multiple foreign keys in parent records (Rails)父记录中的多个外键(Rails)
【发布时间】:2011-08-31 02:32:00
【问题描述】:

我正在尝试摆脱我的连接表,转而采用对大型数据集更快的数据库设计。我打算这样做的方式是将孩子的 id 存储在父记录中。 像这样:

父母表:
id, child1_id, child2_id, child3_id,... child(100)_id

儿童桌:
id,grandchild1_id,grandchild2_id,... 孙子(100)_id

型号:
家长
has_many :children, :dependent => :destroy
接受嵌套属性:儿童
儿童
属于_to :parent has_many :grandchildren, :dependent => :destroy
接受嵌套属性:孙子
孙子
属于_to :child

我的最终结果是能够以相同的形式编辑父母、子女和孙子女。这已经可以通过使用连接表实现,但我热衷于提高性能

当我依赖连接表提供的功能时,我如何才能获得更好的数据库性能? 请帮忙,我已经在网上搜索了很多天了:/ 谢谢!

【问题讨论】:

  • 这是一个糟糕的设计。虽然它可能会加快一种情况的读/写速度,但它仅限于此 - 不仅如此,而且它不正常。如果这确实是您的目标,那么非关系型数据库肯定会更好。
  • Arsen:我更新了我的帖子有一个问题,谢谢

标签: ruby-on-rails performance has-many-through


【解决方案1】:

这是糟糕的数据库设计。如果父母有超过 100 个孩子怎么办? 3 条建议:

  • 考虑使用 NOSQL 数据库存储。

  • 也许使用acts_as_tree。

  • 你能不能这样规范化它:

父级:id

孩子:id,parent_id

孙子:id,child_id

【讨论】:

  • 好吧,我必须承认这不是一个很好的设计。当谈到父母可以有多少孩子时,我已经设定了一个最大值。这对我的应用程序来说不是问题,但总的来说它会很糟糕。您提供的示例很好,而 Parent 表不包含有关 Child 表的信息。我给大家举一个更好的父表例子:Parent: id, child1_id, child1_attribute1, child1_attribute2, child2_id ...等等
【解决方案2】:

您确定性能有问题吗?如果您只是在预测,您可能会进行过早的优化。

如果您能够创建这么多列作为子项的数量,那么我几乎可以肯定您试图避免的数据库设计不是问题。只需确保数据库具有正确的索引即可。

一个工作(并被测试覆盖)的应用程序是考虑性能的一个很好的起点。您可能会注意到使用最简单的方法获得的性能是可以接受的。

【讨论】:

  • 对于我的应用程序。如果我从一位父母开始,我最终会有 20 多个孩子,还有 200 多个孙子孙女。现在说我有 10 000 个父母,那将给我 2 000 000 多个孙子孙女。 2 000 000 个孙子意味着 2 000 000+ 条连接记录,每次我查找 1 个父级时服务器都要经过。这不是问题吗?我问是因为我真的不知道。如果答案是“不”并且您确定这一点,那么您真的拯救了我的一天:)
  • 好吧,我不确定,但您可以尝试最简单的解决方案。在某些情况下,我的恐惧被证明是错误的,而最简单的方法奏效了。
  • 关于数字:如果父母有 20 个孩子,每个孩子有 20 个孙子女,那么对于单个修改对象(一个父母),它只会提供 400 多条记录。一个正确索引的数据库可以毫无问题地从数百万其他记录中找到这些记录。我假设您不使用连接表,而是在每个孩子中使用 :parent_id。我怀疑更大的问题可能是编辑表单的大小(但这取决于每条记录中的数据量)。当然,内存量、使用的数据库、服务器负载和其他因素也可能会影响性能。
  • 感谢 Arsen7。首先,我使用连接表。对于单亲父母,我将有不超过 400 个孙子查找,平均 50 个孙子查找(重要点)。所以查找的数量并不让我担心。让我担心的是大的 child_grandchild 连接表(尽管现在看来它可能不是什么大问题?)。如果正确的索引可以做到这一点,那么我需要阅读索引连接表:) 编辑表单大约 120kB。它很可能会这样做吗(如;这很可能是过早的优化)
  • 顺便说一句:我们安装的服务器是这个:h10010.www1.hp.com/wwpc/us/en/sm/WF04a/…我在信息安全部门,不是网络应用程序开发人员,所以我没有使用连接表的大型数据库的经验对于像这样的网络应用程序。索引连接表...有什么好的资源吗?
猜你喜欢
  • 2011-08-24
  • 2013-04-08
  • 1970-01-01
  • 2014-03-21
  • 2020-06-21
  • 2023-03-30
  • 1970-01-01
  • 2021-04-28
  • 2016-10-01
相关资源
最近更新 更多