规范化数据库所需的建议

时间:2010-03-24 12:32:39

标签: asp.net sql database-design normalization

我试图在ASP.net中为反馈应用程序创建数据库我有以下数据库设计。

Username (PK)

QuestionNo (PK)
QuestionText

FeedbackNo (PK)
Username

UserFeedbackNo (PK)
FeedbackNo (FK)
QuestionNo (FK)
Answer
Comment

用户拥有唯一的用户名 用户可以有多个反馈

我想知道我在这里的数据库设计是否已经规范化并且适合应用程序

编辑 - 反馈有多个问题,因此会有多个反馈答案。希望这是有道理的

编辑 - 我在反馈表中有20个问题,每个问题都可以使用单选按钮(因此是“答案”字段)来回答,并且可以为每个问题添加可选注释。用户可以根据需要多次填写此反馈表。这就是为什么我有链接表有feedbackNo和用户名。

编辑

**Users Table**
UserID (PK) autonumber
Username

**Question Table**
QuestionID (PK) autonumber
QuestionNumber
QuestionText

**Questionnaire Table**
QuestionnaireID  (PK) autonumber
UserID (FK) `User Table`
Date

**Feedback Table**
ID (PK) autonumber
QuestionnaireID (FK) `Questionnaire Table`
QuestionID (FK) `Questions Table`
Answer
Comment

阅读评论后......我是否会对我的设计进行重组,这个新设计是否适合我的需求?

5 个答案:

答案 0 :(得分:3)

你那里有一张多余的桌子。看起来您在反馈和用户之间存在多对多的关系。但是,反馈仅适用于一个用户。基数应该是:

  • 每个反馈一位用户
  • 每个反馈一个问题

您的结构应如下所示:

用户表

用户名(PK)

问题表

Id(PK)
QuestionText

反馈表

Id(PK)
用户名(FK)
QuestionId(FK)

评论


随着c11ada的更新提供,设计立场。我可能在你的情况下唯一的区别是我将答案的日期和时间存储在反馈表中。

另一种方法是创建另一个表,即调查问卷表,它将记录用户填写的反馈实例。

问卷调查表

Id(PK)
用户名(FK)
日期

反馈表

Id(PK)
问卷调查表(FK)
QuestionId(FK)

评论

这是假设调查问卷不是关于另一个用户。在这种情况下,它看起来像:

问卷调查表

Id(PK)
关于用户(FK)
AnsweringUser(FK)
日期

答案 1 :(得分:3)

我会选择类似的东西:

Users
UserID         int     primary key auto number/identity
UserName       

Questions
QuestionID     int    primary key auto number/identity
QuestionNumber
QuestionText   

Feedback
FeedbackID     int    primary key auto number/identity
QuestionID     int    fk 
UserID         int    fk
Answer
Comment

我会考虑在每个表上放置一个LastChgDate和LastChgID FK列,甚至可能是CreateDate和CreateUserID。您不需要在任何这些表中使用特殊列来重新创建插入顺序,自动编号/标识值(虽然并非总是连续的是增量的)也适用于此。

我会避免使用GUID和字符串键(比如Username),因为它们会使每个索引占用更多内存。我会使用代理密钥代替用户名,因为它可能会发生变化(离婚/婚姻/等)。

反馈表有点令人不安,是回答还是评论?可能应该是两个表,或者至少有一个FeedBackType列和一个文本列。 OP没有提供足够的信息来完全回答这个问题。即使在OP的编辑之后,我也不确定我理解:a feedback has multiple questions, so there will be more than one feedback answer

答案 2 :(得分:2)

首先,将用户输入的值作为主键通常是不好的做法。例如,如果您必须更改用户名会发生什么?

我个人会选择类似的东西:

User_ID (PK) (GUID)
UserName

Question_ID (PK) (GUID)
QuestionNumber
Question

Feedback_ID (PK) (GUID)
Question_ID (FK)
User_ID (FK)
FeedbackDate
FeedbackText

此外,答案和评论是否相互独立?您可以考虑使用答案表和评论表。

编辑:FeedbackDate用于订购目的。与保持订单指数相比,这是一种自然的分拣机。

答案 3 :(得分:1)

根据您的编辑,我认为您的设计是正确的 - 反馈表代表用户的问题/答案集合,其中最后一个表定义了给出的各个答案。我不会在最后一个表的名称/ PK中包含“User”一词,因为它是定义用户的Feedback表。称之为“FeedbackAnswer”。

此外,您正在混合代理键和自然键(用户名作为键,而FeedbackNo作为键)。这是一个争论的问题,哪个更好,但我相信更多的人会同意你应该坚持一种方法或另一种方法而不是混合它们(如果可能的话)。

最后,如果用户要从可能的响应列表中选择答案,请考虑使用QuestionAnswer表来定义wach问题的响应,然后将其与FeedbackAnswer表相关联,并更好地规范化响应数据。

答案 4 :(得分:0)

听起来它已经正常化了。问题反馈1-1?如果是这样,请确保在UserFeedback表上有一个包含FeedbackNo和QuestionNo的唯一约束。