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



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

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

第一个表包含用户配置文件

结构:

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表中的选项链接。。。

我不能用内部加入或其他选项提出一个复杂的请求。

现在,问题:

也许您知道在SQLServerforASP.NETMVC3中制作这种结构的更简单的方法吗?

关键要求:

  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--")

为每个字段的选项创建一个单独的表。所以单独的表格被称为种族,高度,头发颜色。让您的ASP.Net代码查询此表,以检索您所说的词典的值。

优点是

  • 如果没有代码,数据库将更可读,因为您可以将选项integer与其描述连接起来
  • 可以在不重新编译代码的情况下添加选项(甚至可能不推荐使用)
  • 可以使用外键约束强制数据的一致性

如果选项从未更改,请为每个选项使用枚举。

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

如果您希望使用LINQ to SQL,它可以很好地处理枚举。

最新更新