SQL设计关系-多对多解析

SQL设计关系-多对多解析,sql,entity-relationship,database-schema,Sql,Entity Relationship,Database Schema,我的餐桌关系似乎无法归结为一对多,我想知道是否有人能提供一些建议 这是一个案例研究,我正在为学校工作。该数据库是为一家电视广播公司(类似于Comcast、DirecTV等)编写的。除了编程表之外,我的大多数表都很好。这是我目前的进展 一个节目可以在一个或多个频道上播放。 一个频道可以播放一个或多个节目。(共有10个频道) 一种通道类型可以由一个或多个通道组成。(有五种类型中的两种,每种类型分配两个特定通道)。 一个编程包可以由一个或多个通道(或通道类型)组成。 一个频道(或频道类型)可以出现在一

我的餐桌关系似乎无法归结为一对多,我想知道是否有人能提供一些建议

这是一个案例研究,我正在为学校工作。该数据库是为一家电视广播公司(类似于Comcast、DirecTV等)编写的。除了编程表之外,我的大多数表都很好。这是我目前的进展

一个节目可以在一个或多个频道上播放。 一个频道可以播放一个或多个节目。(共有10个频道) 一种通道类型可以由一个或多个通道组成。(有五种类型中的两种,每种类型分配两个特定通道)。 一个编程包可以由一个或多个通道(或通道类型)组成。 一个频道(或频道类型)可以出现在一个或多个编程包中

我现在把这些放在一起的方式是这样的:

Programs ->-----|-- Channel Type --|-----< Channel --????----Program Package
-progid (PK)          -chtypeid (PK)        -chnumber (PK)       -pkgid (PK) 
-progname             -chtypedesc           -chtypeid (FK)      - pkgname
-progdesc                                                        -price
-chtypeid (FK)
Programs->---------Channel-Type------
我遇到的问题是程序包和频道之间的问题。我似乎找不到一个能在两者之间工作的关联表

希望我已经解释得足够好了。我会贴一张我现在ERD的照片,但显然我的声誉还不够高

有谁能给我一些建议,我可能会错过什么


谢谢。

您只需在
节目包
频道

我会做类似的事情

CREATE TABLE PackageChannels(
    pkgid VARCHAR(50) REFERENCES PROGRAMPACKAGE (pkgid),
    chnumber VARCHAR(50) REFERENCES CHANNEL (chnumber),
    PRIMARY KEY (pkgid, chnumber)
)
如果不知道您使用的是什么风格的SQL,那么语法可能会被关闭。但答案是连接表


另外,欢迎来到SO

> P>您可能需要考虑说明程序包仅由通道类型组成。每个频道类型由一个或多个频道组成,一个频道显示一个或多个节目;不同频道类型的多个频道可以显示同一节目


如果频道必须是频道类型的一部分,则程序包和频道之间没有(直接)关系。

如果我正确理解您的问题,您需要以下附加关联表

Program_Channel(progid(FK),chnumber(FK)) : Association between program and channel
Channel_ChannelType(chnumber(FK),chtypeid(FK)) : Association between channel and channeltype
Channel_ChannelPackage(chnumber(FK),pkgid(FK)) : Association between channel and channel package

这样,您就可以与上述所有实体建立多对多关系

您的意思是,您需要在节目包和频道之间建立多对多关系

在程序包中添加一个chtypeid(FK),程序包和频道之间就可以通过ChannelType建立多对多关系

Programs Package >-----|------ Channel Type ------|-----< Channel 
-pkgid (PK)                    -chtypeid (PK)             -chnumber (PK)        
-pkgname                       -chtypedesc                -chtypeid (FK)       
-price                                                         
-chtypeid(FK)   
程序包>----|----通道类型----|----
每一行都有一条语句。只需编写描述应用程序情况所需的语句模板

表具有关联的参数化语句(命题)模板(谓词)。表列是模板参数。使模板成为true语句的行是表中的行。其他行/不存在行表示错误。所有表中当前存在和不存在的行一起描述了当前的情况

Programs(progid,progname,progdesc,chtypeid) -- program [programid] named [progname] with description [progdesc] has channel type [chtypeid]
ChannelType(chtypeid,chtypedesc) -- channel type [chtypeid] has description [chtypedesc]
Channel(chnumber,chtypeid) -- channel [chnumber] is of type [chtypeid]
ProgramPackage(pkgid,pkname,price) -- programming package [pkgid] named [pkgname] costs $[price]
-- keys and fks straightforward
模板和可能出现的情况决定了约束。(但无法从约束中推断出模板,或需要什么其他模板。)

请注意,下面的arity约束是根据您找不到的“关联表”的模板给出的

一个节目可以在一个或多个频道上播放

一个频道可以播放一个或多个节目

(共有10个频道)

一种通道类型可以由一个或多个通道组成

(有五种类型中的两种,每种类型分配两个特定通道)

一个编程包可以由一个或多个通道(或通道类型)组成

一个频道(或频道类型)可以出现在一个或多个节目中 包裹

我让你想想“能”有什么贡献。是否应该说一个实体也可以与其他0个实体关联

我遇到的问题是程序包和频道之间的问题。我 似乎找不到在两者之间工作的关联表

你把事情搞砸了。首先找到语句模板。每个模板提供一个表。模板加上情况给出了约束条件。(然后,我们可以合并、分解和/或删除表和/或约束。)


PS:一个节目有一个频道类型。因此,假设它播放的频道是该频道类型,等等。您的问题没有提到节目“拥有(允许?)频道类型”、“节目”在“频道”上“播放”(允许?)或频道类型或节目包“包含(允许?)频道类型”的这一方面频道。

我们一开始就有这种连接表,但该班的教授拒绝了,说不需要它,可以用现有的表来计算关联。我需要对这种类型的连接进行查询,但显然这不是他想要的。您是否仅限于前面列出的四个表?不。我只列出了与我遇到的问题直接相关的表。如果我没记错的话,数据库中总共有11或12个表。但列出的是程序中唯一可以输入频道到套餐关系行的。好吧,教授的期望是,你可以在不添加任何内容的情况下建立所描述的关系
plays(progid,chnumber) -- program [progid] plays on channel [chnumber]
-- 2 fks 
-- plays progid:chnumber is many:many or 1:many
-- plays progid:chnumber is many:many or many:1
-- so (per the previous comment) it's many:many
-- so pk (progid,chnumber)
-- COUNT(Channels) = 10
-- [is this a constraint, or a certain situation?]
CTContainsCh(chtypeid,chnumber) -- channel type [chtypeid] contains channel [chnumber]
-- 2 fks
-- CTContainsCh chtypeid:chnumber is many:many or 1:many
-- so not pk (chtypeid)
-- [is this a constraint, or a certain situation?]
PPContainsCh(pkgid,chnumber) -- programming package [pkgid] contains channel [chnumber]
-- 2 fks
-- PPContainsCh pkgid:chnumber is many:many or 1:many

PPContainsCT(pkgid,chtypeid) -- programming package [pkgid] contains channel type [chtypeid]
-- 2 fks
-- PPContainsCT pkgid:chtypeid is many:many or 1:many
-- PPContainsCh pkgid:chnumber is many:many or many:1
-- so (per the previous comment) it's many:many
-- so pk (pkgid,chnumber)

-- PPContainsCT pkgid:chtypeid is many:many or many:1
-- so (per the previous comment) it's many:many
-- so pk (pkgid,chnumber)

-- probably you intend PPContainsCT(pkgid,chtypeid) == EXISTS chnumber [ PPContainsCh(pkgid,chnumber) AND CTContainsCh(chtypeid,chnumber)]
-- ie PPContainsCT = (PPContainsCh JOIN CTContainsCh) PROJECT_OUT chnumber
-- so it's a view
-- nb its pkgid:chtypeid many:many nature follows from its definition