【问题标题】:Database design best practice – Survey Q&A数据库设计最佳实践——调查问答
【发布时间】:2013-11-22 16:20:57
【问题描述】:

我目前有一个数据库设置来收集问题的答案(Rails 4.0 + MySQL)。解释我们所谓的“网格问题”,例如“您多久在以下每家商店购物一次?”而不是拥有

question has_many answers
answer belongs_to question
answer belongs_to user

我去了:

question has_many data_fields
data_field has_many answers
answer belongs_to data_field
answer belongs_to user

因此每个问题都有 1 个或多个 data_fields 来说明某人购物的每种类型的商店。

我最近有一位数据库顾问坚持认为更好的方法是回到简单的answer belongs_to question 并在问题表中添加 3 列来确定 1)它是一个组定义问题,2)“组号”和3) 在组内的位置

他的解释是,如果我发现自己需要针对所有问题生成报告,这会变得更简单——我不需要通过联合来完成此任务。但我无法说服自己在呈现问题输入以及生成数据进行分析时所带来的好处超过了用户界面带来的压力。

设置此数据库的最佳方法是什么?我知道这有点主观,但从技术上讲,应该有一个最佳实践,所以希望我能被允许发布这个......

【问题讨论】:

  • 我不知道“question has_many data_fields, data_field has_many answers”到底是什么意思。
  • 您的所有问题都是“网格”类型,还是混合类型的问题?
  • 有一个混合。如果我走 data_field 路线,“单个”问题将只有一个自动生成的 data_field。
  • 为什么要把数据库设计成调查问卷?如何为您想要捕获的信息设计数据模型(例如,具有人员、商店和访问次数属性的 PersonStores 表)。调查肯定只是收集信息的一种手段,本身并不是目的。
  • @sqlvogel,调查和问题可以改变和发展。您所说的“信息”是相对静态的。

标签: mysql sql ruby-on-rails database-design ruby-on-rails-4


【解决方案1】:

考虑:

  1. “组”与“问题”有关。它与答案无关。在定义问题和答案之间的关系时,您不需要考虑“组”。

    问题有很多答案。那是土生土长的。没有更多的想法。

  2. 跨表查询是不可避免的。当然,如果可能,您需要尝试减少它,但是如果没有跨表查询,关系数据库将不会保留其名称。

  3. 关于“组”,正如迈克所说,如果一个问题只有一个组,可以将其作为一个字段放在 Question 中以提高速度。但是,这仍然有缺点。如果用户想要订阅多个群组(如 Quora),如何在 Question 中的紧密耦合群组中进行呢?你真的可以在这里消除连接查询吗?

结论:

选择最传统的方式,当您真正遇到瓶颈时稍后优化

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多