Nhibernate 为各种类型的触点设计表

Nhibernate 为各种类型的触点设计表,nhibernate,database-design,Nhibernate,Database Design,今天,我的系统中有三个联系人来源: 系统的用户 通讯录 客户关系管理系统 这些存储在不同的表中。我正在从一个内部ORM解决方案切换到nhibernate,nhibernate得到了很好的继承支持。因此,我正在考虑以下事项: 创建包含所有公共字段的基表 为每个联系人类型(系统、通讯簿、crm)创建一个表,其中包含特定字段+指向基本表行(基本用户id或类似项)的链接。 地址簿(crm) 这种解决方案的好处在于,同步每个源代码要容易得多。将用户从addressbook导入CRM系统只需创建一个CR

今天,我的系统中有三个联系人来源:

  • 系统的用户
  • 通讯录
  • 客户关系管理系统
这些存储在不同的表中。我正在从一个内部ORM解决方案切换到nhibernate,nhibernate得到了很好的继承支持。因此,我正在考虑以下事项:

  • 创建包含所有公共字段的基表
  • 为每个联系人类型(系统、通讯簿、crm)创建一个表,其中包含特定字段+指向基本表行(基本用户id或类似项)的链接。 地址簿(crm)
  • 这种解决方案的好处在于,同步每个源代码要容易得多。将用户从addressbook导入CRM系统只需创建一个CRM表并将其链接到基表中的用户。在通讯簿中修改用户会自动在CRM中修改它

    这将使添加其他源和保持同步变得容易


    我的问题是:你能看到这样的解决方案有什么问题吗?

    加入丛林将是一个问题,导致性能问题。数据库不需要此配置,并且在强制执行此配置时会变慢

    数据库老手经常批评ORM的原因是(至少从我们的角度来看)ORM是向后的,类层次结构对数据库的持久性远不如设计表,然后在表上固定类代码


    为什么不创建反映设计效率的类呢?

    每个层次结构使用一个表更简单,但它放弃了两个功能:

    • 您可能希望其他表仅具有一种联系人类型的外键,但使用每个层次结构的表,这是不可能的。他们提到了一个联系人,就是这样。您可以使用复合键绕过它,但这会丢掉简单性
    • 派生类列在数据库中必须为空
    两种我都试过了。我更喜欢每个层次的表而不是每个子类的表,因为我喜欢将它们都放在一个表中的简单性