【问题标题】:Structure a table with many columns构造一个包含许多列的表
【发布时间】: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 个选项:

  1. 每个属性都有一列,所以:

    HealthRatingNoProblems 位不为空, HealthRatingTemporaryChange 位不为空,

  2. 为 HealthRatings、Hobbies、... 创建查找表 可能我会以更多 60 张左右的桌子结束...

  3. 使用 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


【解决方案1】:

无论如何——请! -- 正常化那张可怜的桌子。如果你最终有 50 或 60 张桌子,那就这样吧。这就是设计。如果用户有爱好,该信息将在爱好表中。如果他有三个爱好,那么爱好表中将有三个条目。如果他没有任何爱好,那么爱好表中将没有任何内容。以此类推所有其他表格。

在您只对爱好感兴趣的所有时间里,您只需要将爱好表与报告表结合起来,而无需理会所有其他表。你不能用一个巨大的、包罗万象的一排试图容纳所有东西来做到这一点。在那里,如果您只想查看爱好信息,您仍然需要阅读整行,将您不想要的所有数据带入。为什么要读入您将要丢弃的数据?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-18
    • 2012-09-15
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多