数据库设计问题

时间:2009-02-19 13:33:25

标签: sql-server-2005 database-design entity-relationship

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

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

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

2 个答案:

答案 0 :(得分:3)

听起来你在这种情况的关系视角中有这个。

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. 将主机信息下推到群集和服务器。当您在Host表中有很多公共信息,并且Cluster或Server表中的子类特定信息非常少时,这非常有用。 Cluster和Server表看起来非常相似(基本上是Host的克隆),其中有几列不同。

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

  4. 在数据库中使用可选的FK字段。这需要将数据库加入到加上Server的Cluster plus Database之间的联合,以获得完整的数据库列表。每个数据库可能必须有一个鉴别器,以便您可以区分两个FK字段中NULL值的各种组合。有四种可能的组合,其中两种是明智的,两种可能是禁止的。试图简单地使用两个可空的FK通常不会很好,所以你经常需要一个状态标志来将Cluster on Cluster与Server上的数据库从未分配给任何东西的数据库分开,从具有未知主机的数据库中分离出来的任何其他状态可能是相关的。

答案 1 :(得分:-2)

选项1:数据库表中有两个字段。一个是服务器,另一个是集群。保持其中一个为空。

选项2:另一种方法是在集群中为每个独立服务器添加一个条目,并仅链接到该表。

选项1真的不是最干净的解决方案(我同意评论),所以选择2:)