【问题标题】:SQL Server one table or two? [closed]SQL Server 一张或两张? [关闭]
【发布时间】:2017-06-15 14:52:43
【问题描述】:

假设我有两个实体,它们具有相似的字段,但有几个不同。例如

public class Foo{
    public int ID{get;set;}
    public int IndexNumber{get;set;}
    public string Name{get;set;}
    public string Info{get;set;}
}

public class Bar{
    public int ID{get;set;}
    public DateTime AppointmentTime{get;set;}
    public string Name{get;set;}
    public string Info{get;set;}
}

在 Entity Framework 中,您实际上可以将 ID、Name 和 Info 放入第三个父类,并让其他两个继承自它,并让它自动将它们一起存储在一个表中,并带有一个“鉴别器”列,该列说明了类名来区分它们。

我的问题是,假设两个模型(外键等)之间没有关系,是用空值和鉴别器做一个表,还是做两个表更好?

【问题讨论】:

  • 我不会把它们放在同一张桌子上,因为它们不是同一个东西。
  • 应该使用数据库规则来设计数据库,以实现良好的设计。在表中混合不同的实体根本不是好的设计。数据库表不是 Excel 工作表。它代表一个实体或一个关系
  • 将多组数据放在一张 Excel 表格中通常也不是一个好主意!
  • 一切都是正确的,但是......有时规则可以“不遵守”(这是我的想法)。此外,这取决于:如果您有其他类似的“对象”,使用带有“鉴别器”列的单个表,可以让您进行更简单的查询,涉及更多“对象”(例如“对象”类型的记录计数) .

标签: c# .net sql-server entity-framework


【解决方案1】:

最好不要从物理存储的角度考虑实体,而是从域考虑。应用不同业务规则且彼此不相关的不同实体应分开存储。

即使FooBar 实体目前具有相关字段集,它们也可以用于不同的目的。并且不要忘记实体不变量,它们可能不同(例如,Foo 类中的 Name 字段只能包含名称,但 Bar 中的 Name 也应该包含姓氏。这是合成示例,但应该指向区别,即使两个字段都是字符串)

【讨论】:

  • 好点。我还要补充一点,将来这两个类可能会以不同的、不相关的方式发展,如果它们保存在同一个表中,这可能会使数据库设计变得不必要地复杂化。
【解决方案2】:

我更喜欢使用 2 个表,或者准确地说,每个具体类的表。您可以在此链接中深入查看不同的方法: Inheritance Strategy in Code-First

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    相关资源
    最近更新 更多