【发布时间】:2014-07-18 21:52:22
【问题描述】:
在 SQL Server 数据库中,我有一个包含大约 200 个项目的表:
create table dbo.Reports
(
Id int identity not null,
HealthRating int not null, --- { One of: NoProblems; TemporaryChange; ... }
Hobbies int not null, --- { Many of: None, Running, Tennis, Football, Swimming }
HobbiesOthers nvarchar (400) null
-- More 100 columns
);
所以我有大约 200 列类型:INT、NVARCHAR、BIT 和 DATETIME。
一些 INT 列作为 HealthRating 来存储一个值。
其他人就像爱好一样可以保存许多项目...并且通常有一个额外的列来将其他选项存储为文本(nvarchar)...
我应该如何构建这个表?我看到了 3 个选项:
-
每个属性都有一列,所以:
HealthRatingNoProblems 位不为空, HealthRatingTemporaryChange 位不为空,
为 HealthRatings、Hobbies、... 创建查找表 可能我会以更多 60 张左右的桌子结束...
使用 Entity Framework 现在支持的枚举和标志枚举,并在我发布的 Int 列中存储一个选择项和多项选择项。
你有什么建议?
【问题讨论】:
-
您没有提供足够的信息。特别是,当其他列以特定方式设置时,是否需要设置任何
null列? -
你的意思是 HobbiesOthers 是否受 Hobbies 中设置的条件限制?好吧,理论上如果 Hobbies 是 None 那么 HobbiesOthers 应该是 null ......但这似乎很难做到,所以我正在考虑当 Hobbies 是 None 这意味着没有选择任何项目。因此,在我的应用程序中检查是否不存在爱好时,我只检查爱好是否为无,以及爱好其他是否为空。这是你问的吗?
-
是的,但需要所有列的答案。
-
如果用户可以定义自己的爱好,那么我会去掉 Hobbies 和 HobbiesOthers 列。相反,我会有一个主爱好表,每个爱好都有一个 HobbyId 和一个 HobbyName。然后会有一个查找表来将爱好映射到 Id。至于 HealthRating,有些程序员选择创建查找表,有些程序员选择将值存储为枚举 int 值,有些程序员选择将其存储为枚举名称。我对 Enums 的偏好是存储名称。对于用户可以定义的字段,我不会使用枚举。
标签: c# sql sql-server entity-framework enums