首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反馈模块的数据库模型

反馈模块的数据库模型
EN

Code Review用户
提问于 2019-12-02 05:15:51
回答 1查看 1.8K关注 0票数 2

我想建立一个在线反馈系统。要求是

  • 管理员可以输入反馈问题
  • 管理员将选择这些问题并创建一个反馈会话。
  • 一个问题可以在许多反馈会话中使用。
  • 用户可以选择任何反馈会话和回答/速率。
  • 一个用户可以多次回答相同的反馈会话。

我的桌子结构是

虚拟数据(并非所有列)

代码语言:javascript
复制
Questions
---------
QuestionId  Question
1           Question 1
2           Question 2
3           Question 3
4           Question 4
5           Question 5


Feedback
--------
FeedbackId  Questions   
2           1,2,3,4,5                   -- Questions column has questionid from Question table

 FeedbackResults
    ---------------
    FeedbackResId   FeedbackId  QuetionID Answers    UserId
    1               2           4          4         1
    2               2           1          3         1
    3               2           5          3         1
    4               2           1          2         2

请给这个设计打分,并提供有价值的建议。逗号分隔值是否负担得起?

EN

回答 1

Code Review用户

发布于 2019-12-13 18:02:45

设计需要简化。根据您的解释,您只需要3个表(问题、答案和反馈),其余的就不需要了,因为您可以JOIN这些表。

逗号分隔值是否负担得起?

对于你的设计,不,你不需要,这并不总是一个好主意去做。有些情况你可以做到,而且可能对你有益,但这些都是罕见的情况。保持简单和标准,不要将列或行连接到单个值中,除非这是必需的!

因此,如果您的Feedback.Questions打算以逗号分隔的值存储问题的值,我建议您更改这个值。只要给每个问题一个新的反馈id,这样就更容易管理了。而不是存储问题字符串,而只是存储questionId (FK)。这样会更合适,而且处理得更快。

所以我建议你把它改造成:

代码语言:javascript
复制
#ListStatus
- Id [PK|IDENTITY]
- Description

#ListRate 
- Id [PK|IDENTITY]
- Description

#FeedbackQuestions 
- Id [PK|IDENTITY]
- Question 
- CreatedAt
- UpdatedAt 
- Deleted
- StatusId
- UserId

#FeedbackAnswers 
- Id [PK|IDENTITY]
- QuestionId 
- Answer 
- CreatedAt 
- UpdatedAt 
- Deleted
- UserId 

#Feedback 
- Id [PK|IDENTITY]
- RateId
- QuestionId
- AnswerId 
- CreatedAt 
- Deleted
- UserId 

Listxxx表将存储固定描述值的列表。例如,ListRate会存储诸如优秀、非常好、好、公平、差的..etc等利率选项。当用户对答案进行评级时,ListRate的Id将被插入到Feedback表中。

此外,由于我们用前缀List来定义它们,所以在系统设计中将标准化,以便在其他表上通用,最好是更容易理解(这样,开发人员就可以从表名中了解这些表的用途)。

我在UserIdCustomerId之间搞混了,但是我使用了userId,所以您使用的是logged-in users,不管是来自Admin还是一些使用系统的客户,最后,您需要记录做出这些更改的Username

另一件事,你可能需要添加一个类别的问题,并可能是反馈。这将对过滤结果非常有帮助。你不想依赖任何用开放文本存储用户输入的列,这将是一个真正的痛苦。因此,在问题中添加一个类别,将其值存储在另一个表中,使其有两列(一列用于为用户显示文本,另一列是id),这将使处理起来更容易,如果您看到可以添加更多筛选选项(支持子类别或标记..etc),就会选择它。

样本:

试题表

代码语言:javascript
复制
| Id |   Question |            CreatedAt | UpdatedAt | Deleted | StatusId | UserId |
|----|------------|----------------------|-----------|---------|----------|--------|
|  1 | Question 1 | 2019-12-14T00:00:00Z |    (null) |  (null) |        1 | User 1 |
|  2 | Question 2 | 2019-12-14T20:40:15Z |    (null) |  (null) |        2 | User 2 |
|  3 | Question 3 | 2019-12-14T07:05:01Z |    (null) |  (null) |        3 | User 3 |

答案表

代码语言:javascript
复制
| Id | QuestionId |   Answer |            CreatedAt | UpdatedAt | Deleted |  UserId |
|----|------------|----------|----------------------|-----------|---------|---------|
|  1 |          1 | Answer 1 | 2019-07-05T00:00:00Z |    (null) |  (null) | User 50 |
|  2 |          1 | Answer 2 | 2019-07-05T00:00:00Z |    (null) |  (null) | User 50 |
|  3 |          1 | Answer 3 | 2019-07-05T00:00:00Z |    (null) |  (null) | User 70 |
|  4 |          2 | Answer 1 | 2019-07-05T00:00:00Z |    (null) |  (null) | User 70 |

反馈表

代码语言:javascript
复制
| Id | RateId | QuestionId | AnswerId |            CreatedAt | UpdatedAt | Deleted |  UserId |
|----|--------|------------|----------|----------------------|-----------|---------|---------|
|  1 |      1 |          1 |        3 | 2019-07-05T00:00:00Z |    (null) |  (null) |   Admin |
|  2 |      2 |          2 |        4 | 2019-07-05T00:00:00Z |    (null) |  (null) | User 23 |
|  3 |      2 |          1 |        2 | 2019-07-05T00:00:00Z |    (null) |  (null) |  User 5 |
|  4 |      5 |          1 |        3 | 2019-07-05T00:00:00Z |    (null) |  (null) | User 23 |

小提琴演示

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/233253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档