基于多种条件的SQL数据库表关系

问题描述 投票:0回答:1

我正在开发一个数据库来存储我们想要用来标准化工作流程的信息。 该项目是一家工程公司,我要存储的信息是硬件模块的IO数据。

我制作了一个“主”表,其中包含需要填写的所有“必填”字段,并且我想将其余数据存储在单独的表中。到目前为止一切顺利。

现在我们面临挑战: 在“主”表中,我定义信号是模拟信号还是数字信号(还有更多,但我们暂时保留它)。模拟数据和数字数据具有非常不同的数据集,因此我想将它们存储在自己的表中,即模拟值表和数字值表。 主表将有一个字段说明该信号是模拟信号还是数字信号(信号类型)。但是,我无法弄清楚如何根据 SignalType 字段的值建立表之间的关系。 我有一个名为 TagName 的 FK 字段,这是我们正在使用的唯一编程名称,但与两个表建立 1:1 关系感觉是错误的,因为 TagName 键只会出现在其中一个表中。

Basic Idea of what I attempt to do

希望有人能帮忙

如前所述,我尝试制作与 TagName 字段具有 1:1 关系的表格。但这并没有创造出我想要发生的事情。我想要基于 SignalType 字段的值的每行表之间的“条件关系”。但我不知道该怎么做。 我确实研究了交叉引用表,但我无法理解在这种情况下如何实现它。

sql database-design relational-database table-relationships
1个回答
0
投票

数据建模中的解决方案称为继承...您的数据模型的设计并没有显示这一点...

子女之间排他性继承的数据模型如下图所示:

那么从技术上来说,在 SQL 中你必须具备:

  • 每个子表必须有一个 PK,其基本 IO 信息 PK 为 还有FK
  • 两个触发器,每个表一个,以确保表之间的排他性 桌子

以 SQL 为例:

CREATE TABLE T_BASIC_IO_INFO_BIO
(BIO_ID    INT IDENTITY PRIMARY KEY,
 ...)

CREATE TABLE T_IO_INFO_ANALOG_IIA
(BIO_ID    INT PRIMARY KEY REFERENCES T_BASIC_IO_INFO_BIO (BIO_ID),
 ...)

CREATE TABLE T_IO_INFO_DIGITAL_IID
(BIO_ID    INT PRIMARY KEY REFERENCES T_BASIC_IO_INFO_BIO (BIO_ID),
 ...)

CREATE TRIGGER E_IU_IIA
ON T_IO_INFO_ANALOG_IIA
AFTER INSERT, UPDATE
AS
...
IF EXISTS(SELECT * 
          FROM   T_IO_INFO_ANALOG_IIA AS A 
                 JOIN NEW 
                    ON A.BIO_ID = NEW.BIO_ID 
                 JOIN T_IO_INFO_DIGITAL_IID AS D 
                    ON A.BIO_ID = D.BIO_ID)
   --> raise an error to rollback
...


CREATE TRIGGER E_IU_IID
ON T_IO_INFO_DIGITAL_IID
AFTER INSERT, UPDATE
AS
...
IF EXISTS(SELECT * 
          FROM   T_IO_INFO_DIGITAL_IID AS D 
                 JOIN NEW 
                    ON D.BIO_ID = NEW.BIO_ID 
                 JOIN T_IO_INFO_ANALOG_IIA AS A 
                    ON A.BIO_ID = D.BIO_ID)
   --> raise an error to rollback
...
© www.soinside.com 2019 - 2024. All rights reserved.