【问题标题】:MySQL/CakePHP DB Design QuestionMySQL/CakePHP 数据库设计问题
【发布时间】:2010-07-12 21:21:09
【问题描述】:

我们的房地产应用程序有一个表 Events,它在历史上一直通过 Event.homes_id 列链接到 Homes 表。

最近,我们首次添加了与房屋无关的事件类型,而是与房地产经纪人相关的。问题:现在将 realtor_id 列添加到 Events 表是一种好习惯吗?我对每条记录都有两列 home_id 和 realtor_id 的想法感到反感,对于任何给定的记录,其中一列将始终为空。我的老板说它很有效并且避免了创建新表的开销。这种情况的对错是什么?

上述问题的推论:我们不愿意创建新表的部分原因是我们使用的是 CakePHP,因此通过 SQL 连接对多个链接表进行绝对控制变得更加困难。 (将 Cake 的递归属性设置为最大值会降低应用程序的速度。) 使用 Cake 是否会影响数据库设计考虑?还是我们只是在使用 Cake 错误?

【问题讨论】:

  • 我感受到了您对 CakePHP 递归问题的痛苦。我喜欢这个框架,但如果你不看它,它真的会远离你。话虽如此,一旦您在 CakePHP 的 find 调用中了解了 ad-hoc join 的乐趣,事情就会变得更容易处理。
  • 感谢大家对这个问题的一些非常有趣的答案,涵盖了争论的两面——实用主义与以最佳方式做事。我们最终坚持了务实的(拐弯抹角?)路线 - 希望它不会在未来的日子里咬我们!

标签: mysql database-design cakephp


【解决方案1】:

我内心有些反叛 有两列,home_id 和 每条记录的 realtor_id,其中之一 对于任何 给定的记录。我的老板说这是 高效并避免了开销 创建新表。什么是 这种情况的对错?

嗯,你是对的,它的效率可能不如最优。但是,添加另一个 50% 的时间为空的列(一个 INT,不少于)不会影响您的整体数据库效率。

OTOH,您需要花费一些精力来重构您的应用程序。只需添加此列,您实际上就是在进行破解。

我认为在这种情况下这是可以接受的,尽管您可能不喜欢它的美感。嘿——没有人喜欢黑客。它增加了“技术债务”。但是用谷歌搜索这个词,你会发现很多人都在说拥抱技术债务,因为它可以让你继续前进,而不是试图将完美的解决方案归零(这将逃脱你,尽管尽了最大努力)。

这是一个商业决策——你的架构和代码库的美感是否值得付出代价(你的小时费率 * # 小时来“正确”修复它)?在这种情况下,我会说可能不是。

【讨论】:

  • 现在确实一切正常,也许我应该为此心存感激!然而,作为一个大计划中的初级程序员,我总是想确保我没有犯下太多违反最佳实践的罪行......总是很好地超越互联网的综合智慧!
  • 无缘无故地积累技术债务几乎总是会在以后回来咬你。
  • @thesunneversets 是的,经验带来的其中一件事是能够弄清楚什么时候足够“优雅”。 @Kalium 当然,“很好的理由”可能只是“快速发展/我需要向前发展/这'足够好'”。确实,技术债务就是这样——必须偿还的债务(通常是重写、次优操作、损坏等)
【解决方案2】:

我的老板说它很高效并且避免了创建新表的开销。

这让我觉得很可疑。我认为您需要不同的设计。

具体来说,我会考虑让 Homes 和 Realtors 拥有活动。通过对此进行重组,您可以避免两个 ID 之一的问题。如果您确实需要,我会将 Realtors/Homes to Events 表示为 has_many,反之则表示为多个 belongs_to 关系。

【讨论】:

  • +1 如果新的桌子是开销,我无法想象他会称之为你必须跳到什么圈子才能确定给定事件是否与房屋或房地产经纪人相关联每次你检索它。调整关系的基数将涉及迁移密钥的一些工作,但在应用程序的剩余生命周期中应该很容易。
  • 无论如何,从“home_id = n”或“realtor_id = n”事件中找到所有内容并不困难,但我很高兴人们分享我的直觉,这很混乱。我仍然无法想象如何重构关系:Events 表中将继续需要哪些 other_table_id 列?
  • 在我建议的架构下,没有。
  • (很抱歉需要被人牵着鼻子走……)我是否正在创建表来交叉引用 event_id 和 realtor_id,以及 event_id 和 home_id?或者,如果我错过了一种在数据之间建立连接的非常巧妙的方法,我想知道它......
  • 您需要两张中间表,一张用于房地产经纪人到活动,一张用于家庭到活动。只需您的基本 HABTAM 表即可涵盖它。
【解决方案3】:

“我们使用的是 CakePHP,因此很难拥有绝对控制权” - 为什么?

添加另一列实际上会失去什么?不是很多。骄傲,也许吧。所有应用程序都会在某处妥协,这只是很小的一个。

“(将 Cake 的递归属性设置为最大会降低应用程序的速度。)” - 那么不要使用递归!可包含的行为做得更好,您可以从任何深度获取所需的数据。

我会添加另一列,使用可包含进行优化,然后转向更重要的事情。

【讨论】:

  • 哇,Containable 看起来难以置信很有用。当你刚开始使用 CakePHP 时,他们并不总是告诉你的事情......
猜你喜欢
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多