0

我正在设计一个数据库并发现我不确定该怎么做的情况,所以首先让我们用图像说明 ER 图的一部分:

ER图

如您所见,我有以下内容:

  • 设备产生 0:N 数据
  • 产生的数据可以是不同的DataType(例如,一个设备可以同时产生温度数据和湿度数据)
  • 特定数据仅由 1:1 设备生成
  • Device和Data之间的1:N关系。由于数据是一个弱实体(没有设备就不能存在数据),我将在由 ID_DEVICE 和 TIMESTAMP 形成的数据中拥有一个复合 PK(未在图像中表示)
  • 由于特定数据只能是一种类型,因此我有专门的“子类型”,从 DataType1 到 DataType10,如果是 DataType2,我有另一种专门化。显然,这些实体中的每一个都具有不同的属性。

我认为要走的路是针对每个子类型,从 Data 实体继承 PK,因为只有 TimeStamp + ID_Device 无法区分行是来自 DataType1 还是来自 DataTypeX。这意味着超类型数据实体不会成为表。

另一方面,如果我应该为 Data 超类型创建一个表,我可以在专业化关系中添加一个字段“type”,以便唯一标识每个数据行。

¿ 在这种情况下我应该如何进行?既然我认为这两种选择都是正确的,那么哪一种提供更多的好处,为什么?任何改进或建议都是允许的!:D

4

2 回答 2

0

您的 ERD 的错误是,您只需要 1 个数据类型表和一个子类型表。那么你应该在 Data 和 Aubtype 之间建立一个关系,在 subtype 和 datatype 之间建立另一个关系。

原因是,数据只属于某个子类型(湿度10,它本身就是湿度类型)

于 2013-04-30T12:27:59.967 回答
0

好吧,由于没有其他人给出答案,而且我已经在实施,我将用我最终所做的来回答我自己的问题。

我应用了我给出的第一个选项,即将数据实体(ID_DEVICE,TIMESTAMP)中的 PK 继承到每个子类型中。所以超类型数据不会成为数据库中的表。

我这样做的原因是因为用户将要执行的查询类型。95% 的时间,查询将针对 1 个设备和 1 个特定数据类型进行,因此拥有一个包含对每个数据类型上的全部行数的引用的数据表实际上没有意义。

在这种情况下,如果我要求显示 DEVICE 1 生成的 DATATYPE3 的所有值,我应该首先查询通用 DATA 表(其中包含对所有其他 DATATYPES 的引用,即使我知道我不需要它们),然后,我应该查询 DATATYPE3 表以实际恢复所需的值(因为 DATA 表没有值)。我认为这非常无能。

希望这对某人有帮助!:)

于 2013-05-17T11:13:22.853 回答