数据库设计 - 下拉输入框问题

时间:2014-12-12 19:04:20

标签: sql-server database

我正在尝试创建友谊网站。我遇到的问题是,当用户加入网站时,他们必须填写表单。此表单包含许多用户必须填写的固定下拉项。以下是其中一个下拉列表的示例。

下拉(收藏宠物)

最喜欢的宠物中的物品

 1. Dog
 2. Cat
 3. Bird
 4. Hampster

将此信息存储在数据库中的最佳方法是什么。现在,配置文件表有一个列用于每个固定下拉列表。这是正确的数据库设计吗?参见示例:

User ID | Age | Country       | Favorite Pet | Favorite Season 
--------------------------------------------------------------
   1    | 29  | United States | Bird         | Summer

这是正确的数据库设计吗?现在我可能有30 +列。大多数列都是固定的,因为它们是下拉列表,用户必须选择其中一个选项。

这个问题的正确方法是什么?

p.s。我还想过为每个下拉列表创建一个表,但这会使查询变得复杂并导致很多表。

另一种方法

Profile

ID | username | age
-------------------
1  | jason    |  27

profileDropDown表:

ID | userID | dropdownID
------------------------
 1 |   1    |      2
 2 |   1    |      7

下拉表:

ID | dropdown | option
---------------------
 1 | pet      | bird
 2 | pet      | cat
 3 | pet      | dog
 4 | pet      | Hampster
 5 | season   | Winter
 6 | Season   | Summer
 7 | Season   | Fall
 8 | Season   | spring

2 个答案:

答案 0 :(得分:3)

"最佳接近方式"或"正确的方式"将在这里开展很多讨论,这可能会使这个问题被关闭。我建议创建一个下拉表,其中包含一个名为" TYPE"的列。或" NAME"。然后,您可以在该列中放置下拉列表的唯一标识符以标识该集合。然后有另一个名为" VALUE"保持下拉值。

例如:

ID |  TYPE  | VALUE
1  | PET    | BIRD
2  | PET    | DOG
3  | PET    | FISH
4  | SEASON | FALL
5  | SEASON | WINTER
6  | SEASON | SPRING
7  | SEASON | SUMMER

然后,为了让您的PET下拉,您只需从此表中选择所有类型=' PET'

答案 1 :(得分:0)

每个用户都会问一组问题(下拉菜单)吗?您(或您的继任者)是否需要随着时间的推移添加或删除问题?如果不是,那么对于每个问题有一列的用户的表是可以的,但是如果是,则它变得复杂。

数据库纯粹主义者每个问题需要两个表:

  • 一个表格,其中包含该问题的所有有效答案的列表
  • 一个表格包含用户与“此”问题的答案之间的多对多关系

如果添加了新问题,请创建新表格;如果删除了一个问题,请删除这些表格(当然,还要调整所有代码。呃。)这样可行,但效率很低。

如果可能的话,所有的问题和答案都是相似的,那么一个三表模型就表明了这一点:

  • 每个问题有一行的表格(QuestionId,QuestionText)
  • 每个问题的每个答案都有一行的表格(QuestionId,AnswerId,AnswerText)
  • 每个用户回答的问题(UserId,QuestionId,AnswerId)有一行的表格

添加和删除问题非常简单,如识别跳过或未回答的问题(例如,如果您在上线后一个月添加新问题)。

与大多数事物一样,这背后有很多“它取决于”,其中大部分取决于您希望系统做什么。