SQL Server数据库的规范化和自定义用户配置文件中的多个下拉菜单

时间:2012-09-04 19:54:53

标签: sql-server asp.net-mvc c#-4.0 database-normalization

ASP.NET MVC 3(SQL Server 2012数据库)中的Web应用程序。

在数据库规范化之后,我有三个用于用户配置文件和配置文件管理系统的数据库表。

第一张表包含用户个人资料

结构:

UserId      int (primary key)
Ethnicity   int
Height      int
HairColor   int
...

示例数据:

1  1  2  1  3
2  1  3  2  4

第二个表格包含个人资料字段列表

结构:

FieldId     int
FieldName   nvarchar(20)

示例数据:

1 - Ethnicity
2 - Height
3 - HairColor 

第三个表包含个人资料字段列表选项(每个个人资料字段的DropDownList选项)

结构:

OptionId    int
OptionName  nvarchar(30)
FieldId     int (external key to FieldId of second table)

示例数据:

1 - Caucasian - 1
2 - Asian - 1
3 - Hispanic - 1
... 
1 - 4"5 - 2
2 - 4"6 - 2

我可以向数据库发出1个请求,以便在html页面中形成下拉列表,全部清除......

但是,当我需要请求成员配置文件时,我需要在应用程序中发出两个请求并处理数据,以便将UserProfile表中的数字与ProfileFieldsOptions表的选项相关联...

我不能使用Inner Join或其他选项发出一个复杂的请求。

现在,问题:

也许您知道在SQL Server for ASP.NET MVC 3中使用这种结构的更简单方法吗?

关键要求:

  1. 配置文件字段和配置文件字段需要选项才能保存在数据库中。
  2. 谢谢,伊戈尔。

3 个答案:

答案 0 :(得分:1)

通过将配置文件字段选项从第三个表重新定位到Dictionary<int, string>,删除第二个表并使用下拉列表来解决问题:

控制器/类/模型中的

我使用类BaseConstants,它由公共字典组成:

public Dictionary<int, string> Ethnicity = new Dictionary<int, string>()
    {{1, "Caucasian"}, {2, "Black"}, ...};

并在视野中:

@Html.DropDownListFor(model => model.Item, 
    new SelectList((Dictionary<int, string>)ViewBag.Items,"Key", "Value"), 
    "--Select--")

答案 1 :(得分:0)

为每个字段的选项创建一个单独的表。所以单独的表名为Ethnicities,Heights,HairColors。 让您的ASP.Net代码查询此表以检索您所说的字典的值。

优点是

  • 如果没有代码,数据库将更具可读性,因为您可以将选项整数加入其描述
  • 可以添加(甚至可能已弃用)选项而无需重新编译代码
  • 您可以使用外键约束来强制执行数据的一致性

答案 2 :(得分:0)

如果选项永远不会改变,请为每个选项使用枚举。

  • 调试时,它们会有描述性名称。
  • 将输入属性,以便保持某种形式的一致性。它将防止从一个字段到另一个字段的意外交换或填写字段的无效选项号。

如果您希望使用它,LINQ to SQL可以正常处理枚举。