【问题标题】:Most elegant solution for humungous problem解决巨大问题的最优雅的解决方案
【发布时间】:2010-10-04 15:46:11
【问题描述】:

我正在一个用户可以选择适用于他们的某些日期的网站上工作,例如日期 1、日期 2、日期 3 等。

每个日期都有属于它的特定问题,因此如果客户勾选“日期 1”以表明该日期适用于他,他会看到一堆文本框询问他有关日期 1 及其适用方式给他们。其他日期也是如此。

日期 1 和 2 以及几个问题,但其余日期只有 1 个问题。

这些日期及其答案稍后将用于为客户创建个性化提醒并发送给他。

我还想要一种可以让添加额外日期和字段变得简单(或尽可能简单)的设计。

我的问题是,在数据库中存储与用户相关的所有日期及其答案的最佳方式是什么?我在想,在user 表中,我有来自日期 1 的boolean 列 - 最后日期(显然它们实际上并未命名为日期 1、日期 2 等)。如果日期 1 的列设置为 0,则表示客户没有勾选,如果设置为 1,则表示他勾选了,并且他回答了问题。

关于日期的实际存储,我正在考虑以下两个选项:

1) 每个日期有 1 个表格,其中包含针对该日期提出的每个问题的列和一个 user_id 列。所以在Date_1 表中,我将有Q1_nameQ2_name 之类的列以及用户给出的问题的答案。

但我想要更优雅的东西,因为 1),在计算什么信息时获取所有用户的答案会很痛苦。在发送个性化电子邮件时适用于他们。 2) 有些日期只有 1 个问题,所以为他们创建一个完整的表格会很丑。

2) 一个user_answer 表,包含以下列:

user_id,date_name,question_name,answer_val

2 似乎是迄今为止最优雅的,但应该有更好的解决方案。有什么想法吗?

【问题讨论】:

    标签: php mysql database-design


    【解决方案1】:

    听起来您想要类似以下(基本)表结构:

    • 用户 - userId, userInfo
    • 日期 - dateId, dateInfo
    • 问题 - questionId, questionInfo
    • UserDate - userId, dateId - 存储适用于给定用户的所有日期,并表示用户和日期之间的多对多关系 - 一个用户可以有多个日期,一个日期可以有多个用户李>
    • DateQuestion - dateId, questionId - 存储适用于给定日期的所有问题,并表示日期和问题之间的多对多关系 - 一个日期可以有很多问题,我假设一个问题可以是用于多个日期
    • UserResponse - userId, questionId, questionResponse - 存储所有用户对任何问题的回答。如果您需要知道问题适用于哪个日期,假设他们可以在多个日期多次回答同一个问题,请添加 dateId 列。

    【讨论】:

      【解决方案2】:

      选项 2 似乎接近于好的解决方案,但我会将 date_namequestion_name 替换为 date_idquestion_id
      能够添加新问题和日期的最佳且最简单的解决方案似乎是:
      1. 带有字段date_id, title, date的日期表。
      2. 带有字段question_id, date_id, title 的问题表(并可能输入答案和描述)。
      3. 带有question_idanswer 的答案表。

      您还需要确定您是否有几个日期共同的问题,以及在这种情况下该怎么做。 (你可能想要两个不同的答案,或者一个共同的答案)。我建议不要使用第一个解决方案,它会使问题变得不动态 - 您必须针对问题或日期的每次更改更改 sql 和表结构。

      【讨论】:

        【解决方案3】:

        我想你已经明白了,唯一的事情是你可以将问题和日期名称分开到一个单独的表中,为你提供以下架构:

        用户id, ...(姓名、出生日期、喜欢的食物等)
        日期名称id, name(称为日期名称,因此不会与Date 这个词,在 SQL 中可能表示其他含义)
        问题id, date_id, text
        UserAnsweruser_id, question_id, answer_val

        没有必要将它们分开,但这样做有三个原因: 1. 查找整数(如question_id)比查找文本(如question_name)要快得多,因为整数更小且大小固定。 2. 如果您将文本更改为问题(例如更正拼写错误),您只需更改问题中的单个条目,而不是每行。 3. 因为您只存储每一位文本一次,所以可以节省大量空间。存储 1000 个整数小于存储 1000 个字符串。只要字符串长于几个字符即可。

        除此之外,我认为这可以很好地工作。

        【讨论】:

          猜你喜欢
          • 2011-03-31
          • 2018-04-28
          • 1970-01-01
          • 1970-01-01
          • 2011-02-13
          • 1970-01-01
          • 1970-01-01
          • 2011-10-15
          • 2023-03-19
          相关资源
          最近更新 更多