最优雅的解决方案

时间:2009-01-31 09:43:14

标签: php mysql database-design

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

每个日期都会有属于它的某些问题,因此如果客户选中“日期1”以表明此日期适用于他,那么他会看到一堆文本框,询问他有关日期1及其适用方式的信息。给他们。所有其他日期也一样。

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

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

我也喜欢一种设计,它可以简单(或尽可能简单)添加额外的日期和字段。

我的问题是,在数据库中存储与用户相关的所有日期和答案的最佳方法是什么?我想在user表中,我有boolean列来自日期1 - 上一个日期(显然它们实际上并没有命名为日期1,日期2等)。如果将日期1的列设置为0,则表示客户没有将其关闭,如果是1那么这意味着他做了,并且他回答了问题。

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

1)每个日期有1个表格,每个问题的列都是{1}}列。因此,在user_id表中,我会有Date_1Q1_name等列以及用户提出的问题的答案。

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

2)一个Q2_name表,其中包含以下列:

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

3 个答案:

答案 0 :(得分:3)

听起来你想要以下(基本)表结构:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

我认为你已经得到了它,唯一的问题是你可以将问题和日期名称分成一个单独的表,给你以下架构:

  

用户id, ...(姓名,出生日期,喜欢的食物等)
   DateName id, name(称为DateName,因此与单词Date没有冲突,这可能意味着SQL中的其他内容)
  问题id, date_id, text
   UserAnswer user_id, question_id, answer_val

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

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