相关疑难解决方法(0)

类别之间的超类型/子类型决定:完全不相交或不完全重叠

我正在构建一个库存数据库,用于存储 IT 硬件,例如台式计算机、笔记本电脑、交换机、路由器、手机等。我正在使用超类型/子类型模式,其中所有设备都存储在一个表中,以及特定信息被放入子类型表中。我的困境是在以下两种设计之间进行选择:

在此处输入图片说明

在上图中,所有设备共享公共子类型。例如,台式计算机和膝上型计算机将在下表中具有记录:Device、NetworkDevice。交换机将在以下位置记录:设备、网络设备。路由器将在以下位置记录:Device、NetworkDevice、WANDevice。我们跟踪位置的任何设备都将在位置记录。我认为此设置的一些优点和缺点:

  • 优点:基于通用字段(如主机名或位置 ID)选择记录更容易。
  • 优点:没有空字段。
  • 缺点:应包含在特定设备的 CRUD 操作中的表并不明显,可能会混淆未来的 DBA。

在底部图表中,所有设备都有自己的子类型(此处未显示更多设备类别)。在这种情况下,很明显哪些表记录被插入或从中选择。台式电脑和笔记本电脑进入电脑等。我认为这个设置的一些优点和缺点:

  • 优点:对于子类型的 CRUD 操作使用哪些表是显而易见的。
  • 优点:只需使用一张表进行 CRUD 操作。
  • 缺点:根据公共子类型字段选择记录需要组合所有表,例如按主机名或位置 ID 搜索。

在这两种情况下,ClassDiscriminator 字段都放置在子类型表中,与 CHECK 约束一起使用以控制可以插入的类型。

是否有关于哪种设计更好的建议,或者这完全是意见问题并取决于数据库的预期目的?

编辑:我有一个关于“NetworkDevice”表的重叠性质的具体问题。该表旨在保存具有主机名和/或 IP 地址的任何设备的网络信息,无论是计算机、交换机还是路由器。该表的重叠性质是否会导致问题,或者以这种方式实现它是否可以?

预先感谢您提供的任何意见。请询问是否需要任何其他信息。

database-design subtypes

12
推荐指数
1
解决办法
3万
查看次数

不知道如何将可变实体转化为关系表

介绍和相关信息:

下面的例子说明了我面临的问题:

动物有一个种族,可以是可以是SiamesePersian可以是德国牧羊犬拉布拉多猎犬

Animal 是一个强大的实体,而其种族是一个属性,可以具有两个提供的值之一( cat 或 dog )。 这两个值都很复杂(我在这里只添加了狗/猫的类型来说明问题,但也可以有猫/狗的名字和一堆其他东西)。

问题:

我不知道如何为此示例创建关系表。

我解决问题的努力:

我曾尝试使用陈的符号绘制 ER 图,这代表了问题,但作为初学者,我不知道我是否做得对。这是我得到的:

在此处输入图片说明

如果我画错了,我深表歉意,如果是这样,请纠正我。我不希望简单地获得“免费解决方案”,而且还希望学习如何处理这个问题,以便我将来可以自己解决。

我唯一想到的是创建两张单独的桌子,一张给猫,一张给狗。此外,Animal表中的race属性将只存储catdog值。像这样的东西:

Animal< # Animal_ID, race, other attributes >
Cat < # Cat_ID, $ Animal_ID, breed >
Dog < # Dog_ID, $ Animal_ID, breed >
Run Code Online (Sandbox Code Playgroud)

我真的对我的解决方案有一种不好的感觉,我担心它是错误的,因此下面的问题。

问题:

  • 如何将我的示例转换为 ER 图?
  • 如何将该 ER 图转换为关系表?

如果需要更多信息,请发表评论,我会尽快更新我的帖子。也可以随意添加适当的标签,因为我在这里很新。

谢谢你。

database-design subtypes

9
推荐指数
1
解决办法
1679
查看次数

我的类型/子类型设计模式(对于互斥子类)的实现是否正确?

介绍

为了让这个问题对未来的读者有用,我将使用通用数据模型来说明我面临的问题。

我们的数据模型由两个实体组成,它们应标记为AB。为了简单起见,它们的所有属性都将是int类型。

实体A具有以下属性:DX;实体B具有以下属性:DY

问题

由于两个实体共享共同的属性D,我决定应用类型/子类型设计。

我不确定我的实现是否正确,因此我在这里要求进行设计审查。

我的实现

-- lookup table for discriminator column
CREATE TABLE ClassType
(
  ClassTypeID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
  Class_Description VARCHAR(50) NOT NULL
);

-- inserting types A and B from our example 
INSERT INTO ClassType (Class_Description)
VALUES ('A'), ('B');

-- creating base class table
CREATE TABLE BaseClass
(
  BaseClass_ID INT …
Run Code Online (Sandbox Code Playgroud)

database-design sql-server sql-server-2012 subtypes

7
推荐指数
1
解决办法
1049
查看次数