【问题标题】:How to design a junction table in a many to many relationship with potentially non unique rows如何设计具有潜在非唯一行的多对多关系的联结表
【发布时间】:2020-06-27 08:18:12
【问题描述】:

我正在为放置在房子周围不同房间的传感器设计一个家庭数据库。到目前为止,我已将数据库映射如下:

tbl_floor = id, name - (e.g 1, first)
tbl_room = id, floor_id, name - (e.g 1, 1, lounge)
tbl_sensortype = id, name - e.g (1, dht11)
tbl_measurementtype = id, name - e.g (1, temperature)

传感器和测量之间有多对多的关系(例如 dht11 可以做温度和湿度),因此我有一个连接表:

tbl_sensortype_measurementtype = id, sensortype_id, measurementtype_id - (e.g 1, 1, 1) for a dht11 sensor's temperature measurement (it does other things too)

现在是我的问题:

每个房间可能有多个相同类型的传感器(例如,一个房间有一个玻璃容器,带有一个温度传感器和一个室温传感器)。因此,表 tbl_room 和 tbl_sensortype_measurementtype 之间存在多对多关系,但这可能会导致联结表中的行不唯一:

tbl_room_sensortype_measurementtype = room_id, sensortype_measurementtype_id - (e.g 1, 1) is a dht11 sensor's temperature measurement in the lounge

但是,如果将第二个 dht11 传感器放置在同一个房间中,则会有相同的行。

我可以在联结表中放置一个 id,然后使其独一无二,但很难区分它们,即

tbl_room_sensortype_measurementtype = id, room_id, sensortype_measurementtype_id

因此,在此连接表中包含另一个称为“实例”的列是否明智(从设计角度来看是可以接受的),以便我可以轻松地区分同一房间中相同类型的两个传感器?还是有更好/更可取的方法?即我的联结表将被定义为:

tbl_room_sensortype_measurementtype = id, room_id, sensortype_measurementtype_id, instance

然后,当我想从传感器记录一个值时,我的值表将被定义为:

tbl_values = room_sensortype_measurementtype_id, value, time

我希望我的问题是有道理的(我正在学习数据库设计作为一个“有趣”的项目)。 谢谢, 马丁

【问题讨论】:

    标签: sql database sqlite


    【解决方案1】:

    您可以使用一个新表来代替tbl_room_sensortype_measurementtype,该表在房间及其传感器之间进行映射,如下所示,

    tbl_sensor_room = id, room_id, sensortype_id
    

    尽管房间和传感器类型相同,但这里每个传感器都有一个唯一的id。该表可以稍后在 SQL 中与tbl_sensortype_measurementtype 连接以获取测量类型。

    instance 在唯一性方面成为冗余列,因为它已经被id 捕获。可以使用id 编写SQL 查询,以在不使用instance 的情况下实现任何所需的结果。从设计的角度来看,除非有 SQL 查询可以从直接查询 instance 列(例如查询房间的第一个实例等)中受益,否则没有必要这样做。

    【讨论】:

    • 谢谢 Shiram,但是可以在该表中放置另一列名为 instance 的列来帮助我区分同一房间中的两个传感器吗?
    • 感谢您的更新。我只是在想未来。如果我在同一个房间里有两个相同的传感器,我会看到 id 可以区分它们并使它们从设计角度来看是独一无二的。我会分配 id 而不是使用自动增量吗?这将使我能够轻松地区分传感器 1 和传感器 2。例如,两行可以是 (1,1,1) 和 (2,1,1)。我在表 tbl_room_sensortype_measurementtype 背后的原因是,这意味着我的数据表中的列数将更少,而如果我使用 tbl_sensor_room,我的表中将需要一个额外的列
    • 空间不足:数据表需要 sensor_room_id、measurement_type_id、value、timestamp。这更可取吗?再次感谢您的帮助。
    • 您好,根据您的有用回复,我对原始问题进行了一些更改。然而,它引发了更多的问题。谢谢,马丁
    • @MartynW 。 . .我强烈建议您不要在回答后更改您的问题。这不仅可能使答案无效 - 一个可能已正确并被接受的答案 - 而且如果 OP 只是要改变它,其他人也没有兴趣回答问题。更好的解决方案是接受原始问题的答案并提出新问题。
    猜你喜欢
    • 2021-09-07
    • 2016-04-09
    • 2012-07-12
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2015-07-15
    相关资源
    最近更新 更多