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中制作这种结构的更简单的方法吗?
关键要求:
- 需要配置文件字段和配置文件字段选项才能保存在数据库中
谢谢,伊戈尔。
通过将配置文件字段选项从第三个表重新定位到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,它可以很好地处理枚举。