Database design 在表每类型(TPT)继承中的父级或子级添加列

Database design 在表每类型(TPT)继承中的父级或子级添加列,database-design,Database Design,拥有不同类型的资产,一些基于技术的资产应该有一个IP列,并且该IP应该是唯一的。但非技术资产甚至不会有IP列。目前,我将数据存储如下:- 但我不确定IP地址存储在哪里,我有以下方法:- 将其存储在“资产”父表中,这样我就可以将其设置为唯一密钥,并保证基于技术的资产不会具有相同的IP。但缺点是,对于所有非技术资产,IP列始终为空 第二种方法;是将IP列添加到每个基于技术的表中。这将防止空值,但需要自定义工作来保证唯一性。因为我只能保证每个表的唯一性,而不能保证所有基于技术的资产的唯一性 那么,有

拥有不同类型的资产,一些基于技术的资产应该有一个IP列,并且该IP应该是唯一的。但非技术资产甚至不会有IP列。目前,我将数据存储如下:-

但我不确定IP地址存储在哪里,我有以下方法:-

  • 将其存储在“资产”父表中,这样我就可以将其设置为唯一密钥,并保证基于技术的资产不会具有相同的IP。但缺点是,对于所有非技术资产,IP列始终为空
  • 第二种方法;是将IP列添加到每个基于技术的表中。这将防止空值,但需要自定义工作来保证唯一性。因为我只能保证每个表的唯一性,而不能保证所有基于技术的资产的唯一性
  • 那么,有没有人能建议我应该采用哪种方法,或者有其他我不知道的方法

    ::编辑::

    我目前拥有以下数据库结构:-

    目前我看到以下几点:-

  • 我在基本资产表中引入了一个冗余的AssetTypeID列,这样我就可以知道资产类型,而不必连接表。这可能会破坏正常化

  • 在我上面的体系结构中,我无法控制(在数据库级别)哪个资产应该有IP,哪个资产不应该有IP,哪个资产可以/不能有多个IP。那么,有没有一种方法可以改进我的体系结构来处理这两点呢

  • 提前感谢您的帮助。

    您可以创建另一个表
    TechnologyAsset
    ,该表继承自
    Asset
    。然后
    服务器
    路由器
    可以从
    TechonlogyAsset
    继承。

    编辑:

    你的第二个评论完全改变了一切。您提供的两个选项都不允许将多个IP地址用于单个资产。在这种情况下,您应该创建一个
    ipaddress
    表,然后该表有一个指向
    Asset
    的外键。这样,您就可以为给定的资产拥有零个、一个或多个IP地址

    第二次编辑:

    关于第1点,是的,它会导致数据损坏或无效。在性能和防错之间有一个内在的权衡。索引有助于提高性能,并且仍然保持规范化,但是在世界上所有索引中添加该TypeId的性能是无与伦比的

    关于第2点,我认为在强制某些资产拥有1个IP、某些资产拥有0个IP和其他资产拥有多个IP的同时,保持IP的唯一性是相当困难的。我正在起草一些东西,但是查询和插入,更不用说更新了,这将是一个真正的痛苦


    我建议通过应用程序业务规则、存储过程等强制执行这些规则。

    老实说,我以前没有做过这种多重继承吗?但是,在关系数据库中拥有这种多级继承是最佳做法吗?我没有显示的某些资产可能有多个与其相关的IP地址。你说得对,你能看到我的编辑和我的新数据库关系图吗。新图表将解决IP地址的唯一性问题。但也造成了一些其他问题。。