Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 接驳台及;规范化问题_Database Design_Normalization_Junction Table - Fatal编程技术网

Database design 接驳台及;规范化问题

Database design 接驳台及;规范化问题,database-design,normalization,junction-table,Database Design,Normalization,Junction Table,我很难确定以下设计模式是否可以接受。对于关系模型,我有以下要求(以及其他一些要求): 1) 它必须能够表示应用程序(例如AppA,AppB,AppC),每个应用程序都有自己的一组属性 2) 每个应用程序都可以通过不同的渠道进行通信,如互联网(电子邮件、Twitter、Facebook)、手机(短信、彩信等),因此程序和渠道之间存在多对多关系 3) 有一组预定义的标识符(地址、电话号码、登录帐户),可以由许多程序共享,因此,程序和标识符之间同样存在多对多关系 4) 同一标识符可以发送多种类型的消息

我很难确定以下设计模式是否可以接受。对于关系模型,我有以下要求(以及其他一些要求):

1) 它必须能够表示应用程序(例如
AppA
AppB
AppC
),每个应用程序都有自己的一组属性

2) 每个应用程序都可以通过不同的渠道进行通信,如
互联网
(电子邮件、Twitter、Facebook)、
手机
(短信、彩信等),因此程序和渠道之间存在多对多关系

3) 有一组预定义的标识符(地址、电话号码、登录帐户),可以由许多程序共享,因此,程序和标识符之间同样存在多对多关系

4) 同一标识符可以发送多种类型的消息,程序也可以发送多种类型的消息(同样,多对多),但我需要能够在每个应用程序的基础上限制通信类型标识符的使用

基本上,我所做的是创建四个表,
Program
Channel
Ident
CommunicationType
来存储关于每个表的信息,而不是为
(程序,频道)
(程序,标识符)
,创建连接表,等等,这会使设计复杂化,我创建了一个表,由这四个表的主键组成,对
(程序、频道、标识、通信类型)
有唯一的约束。现在,该表的每条记录都链接到给定的通信


当然,这很容易就解决了我的问题,但现在我在问自己,如果这违背了正常化原则,这是否可以接受。有谁能给我一个意见吗?

很抱歉给你提供了一个需要更多信息的答案。我在这一点上的声誉不容评论

根据解释,我看不出所选择的设计有什么错

然而,要真正回答您的问题,了解您选择此设计的原因是非常有用的

毕竟,如果没有包含所有键和复合唯一索引的单个表,它也可以工作。以这种方式锁定所有组合是相当有限制的

找到通信后,您仍必须与一个或多个其他表联接,才能访问构成通信的信息


为什么要以这种方式存储每个唯一的通信路径?

很抱歉为您提供了询问更多信息的答案。我在这一点上的声誉不容评论

根据解释,我看不出所选择的设计有什么错

然而,要真正回答您的问题,了解您选择此设计的原因是非常有用的

毕竟,如果没有包含所有键和复合唯一索引的单个表,它也可以工作。以这种方式锁定所有组合是相当有限制的

找到通信后,您仍必须与一个或多个其他表联接,才能访问构成通信的信息

为什么要以这种方式存储每个唯一的通信路径?

我不会这样做

我将在每对表(或n元组)之间创建一个连接表。这最终将允许更简单的查询,并且还允许您在每种情况下独立于其他情况以适当的方式约束行

您还可能会发现这些连接需要额外的属性,比如从一个软件到另一个软件,方向性是什么,有效负载,使用的语言,访问的查询点等等。

我不会这样做

我将在每对表(或n元组)之间创建一个连接表。这最终将允许更简单的查询,并且还允许您在每种情况下独立于其他情况以适当的方式约束行

您还可能会发现,在这些连接上需要额外的属性,比如从一个软件到另一个软件,方向性、负载、使用的语言、访问的查询点等等

基本上,我所做的就是创造 四个表、程序、频道、标识 和要存储的通信类型 关于其中每一项的信息,以及

好主意

而不是创建连接表 对于(节目,频道),(节目, 标识符),等等 只是把设计复杂化了,我创造了 一张桌子,由 这四个表的主键 对(程序、, 频道、标识、通信类型)

在设计这样的表时,需要注意一件事。您的结构具有键{Program,Channel,Ident,CommunicationType},允许程序和通道、通道和Ident、程序和通信类型等各种可能的组合。有时候这是个坏主意

同一标识符可以发送多个 消息的类型,以及 程序(再次,多对多),但我 需要能够限制 上的通信类型的标识符 a按每项申请计算

这就是为什么这是个坏主意。您似乎在说,不是每个Ident、Program和CommunicationsType的组合都是有效的

将有效组合存储在它们自己的表中。使用外键引用来维护数据完整性

构建一个具有键{Program,Identit,CommunicationsType}的表。具有键{Program,Channel,Identit,CommunicationType}的表可以为其设置外键引用

构建尽可能多的表来实现您知道的所有约束。更多的表意味着数据完整性检查更简单。(你可能需要比我提到的更多的桌子。不要以为它们是真的
create table pc (
    program_name varchar(10) not null references programs (program_name),
    channel_name varchar(10) not null references channels (channel_name),
    primary key (program_name, channel_name)
);

create table pict (
    program_name varchar(10) not null,
    channel_name varchar(10) not null,
    comm_type varchar(10) not null references communication_type (comm_type),
    primary key (program_name, channel_name, comm_type),
    foreign key (program_name, channel_name) 
        references pc (program_name, channel_name) 
);

create table your-table-name (
    program_name varchar(10) not null,
    channel_name varchar(10) not null,
    comm_type varchar(10) not null,
    ident varchar(10) not null,
    primary key (program_name, channel_name, comm_type, ident),
    foreign key (program_name, channel_name, comm_type) 
        references pict (program_name, channel_name, comm_type),
    foreign key (ident) references ident (ident)
);