我正在尝试为服务器和数据库库存设计一个数据库,并且我正在寻找一个好的数据库设计。我们有服务器集群、独立服务器和数据库的表。我想在数据库中表示以下关系:

从集群到服务器的一对多关系。
从数据库到集群/服务器的一对多关系。

困难在于第二个关系,因为集群和服务器位于不同的表中,并且集群由服务器组成。表示这种关系的最佳方式是什么?

有帮助吗?

解决方案

听起来你对这种情况的关系看法似乎是这样的。

Cluster : name, other attributes of cluster

Server : name, optional FK to cluster, other attributes of a server

Database : name, (FK to cluster OR FK to server)

问题在于,现实世界的情况有些复杂,关系技术无法清楚地反映这一情况。

Host -- an abstract superclass for places a database can run.

Cluster (extends Host) : name, etc.

Server (extends Host) : name, optional FK to cluster.

Database : FK to Host

您有多种选择来处理此类“子实体”问题。

  1. 将主机、集群和服务器折叠到一个表中。这导致主机(作为集群)和主机(作为服务器)之间存在递归关系。这有点烦人,但它确实为主机、集群和服务器创建了一个表。生成的表有很多空值(集群行使用一组列,服务器行使用一组不同的列。)您必须添加一列来区分主机的子实体。

  2. 将主机信息推送到集群和服务器中。当主机表中有很多公共信息,而集群或服务器表中有很少的子类特定信息时,这非常有用。集群和服务器表看起来非常相似(本质上是主机的克隆),但有几列不同。

  3. 基于主机中的鉴别器在(主机和集群)或(主机和服务器)之间使用联接。虽然相当复杂,但它可以很好地扩展,因为所有数据库都连接到主机,并且完整的主机列表是连接到服务器的主机加上连接到集群的主机的联合。

  4. 在数据库中使用可选的 FK 字段。这需要加入到集群的数据库和加入到服务器的数据库之间的联合,以获得完整的数据库列表。每个数据库可能必须有一个鉴别器,以便您可以区分两个 FK 字段中 NULL 值的各种组合。有四种可能的组合,其中两种是合理的,两种可能是禁止的。尝试简单地使用两个可为空的 FK 通常效果不佳,因此您通常需要一个状态标志来将集群上的数据库与服务器上的数据库、未分配给任何内容的数据库、具有未知托管的数据库与可能存在的任何其他状态分开。相关的。

其他提示

选项1:在数据库中具有表两个字段。一指服务器,其他集群。保持它们中的一个空值。

选项2:另一种方法是添加在簇为还各自独立服务器和链接只向表中的条目

选项1是真的不干净的溶液(i不与评论同意),所以要为选项2:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top