SQL设计关系 - 多对多解析

时间:2014-06-13 15:29:09

标签: sql entity-relationship database-schema

我有一个表格关系,我似乎无法解决一对多,我想知道是否有人可以提供一些建议。

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

一个程序可以在一个或多个频道上播放。 一个频道可以更多地播放一个或多个节目。 (总共有10个频道) 一种通道类型可以包含一个或多个通道。 (有5种类型中的两种,每种类型分配2个特定通道)。 一个编程包可以包含一个或多个通道(或通道类型)。 一个通道(或通道类型)可以出现在一个或多个编程包中。

我目前把这个放在一起的方式是这样的:

Programs ->-----|-- Channel Type --|-----< Channel --????----Program Package
-progid (PK)          -chtypeid (PK)        -chnumber (PK)       -pkgid (PK) 
-progname             -chtypedesc           -chtypeid (FK)      - pkgname
-progdesc                                                        -price
-chtypeid (FK)

我遇到的问题是Program Package和Channel之间的问题。我似乎找不到在两者之间起作用的关联表。

希望我已经解释得这么好了。我发布了当前ERD的图片,但显然我的声誉还不够高。

任何人都可以就我可能缺少的东西提供一些建议吗?

感谢。

5 个答案:

答案 0 :(得分:0)

您只需要Program PackageChannel

之间的联结表

我会做像

这样的事情
CREATE TABLE PackageChannels(
    pkgid VARCHAR(50) REFERENCES PROGRAMPACKAGE (pkgid),
    chnumber VARCHAR(50) REFERENCES CHANNEL (chnumber),
    PRIMARY KEY (pkgid, chnumber)
)

不知道您使用语法的SQL的哪种风格可能会被关闭。但答案是结点表

另外,欢迎来到SO。

答案 1 :(得分:0)

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

如果某个频道必须是频道类型的一部分,那么您在节目套餐和频道之间就不会有(直接)关系。

答案 2 :(得分:0)

如果我理解你的问题,你需要以下额外的关联表。

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

通过这种方式,你可以与所有上述实体建立多对多的关系

答案 3 :(得分:0)

您说您需要程序包和频道之间的多对多关系。

将一个chtypeid(FK)添加到Program Package中,你将在ChannelType和ChannelType之间建立多对多的关系。

Programs Package >-----|------ Channel Type ------|-----< Channel 
-pkgid (PK)                    -chtypeid (PK)             -chnumber (PK)        
-pkgname                       -chtypedesc                -chtypeid (FK)       
-price                                                         
-chtypeid(FK)   

答案 4 :(得分:0)

只需编写描述应用程序情况所需的语句。

表格有声明。表列是语句参数。使该语句为true的行将进入表中。其他行使语句为false。所有表中当前存在和不存在的所有行一起描述了当前的情况。

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约束是根据&#34;关联表&#34;的语句给出的。你找不到

  

一个程序可以在一个或多个频道上播放。

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:may or many:1
-- so it's many:many
-- so pk (progid,chnumber)
  

(总共有10个频道)

-- 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 (chnumber)
  

(有5种类型中的两种,每种类型分配了2个特定通道。)

-- [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 
-- 2 fks[chtypeid]
-- PPContainsCT pkgid:chtypeid is many:many or 1:many
  

一个通道(或通道类型)可以出现在一个或多个编程中   包。

-- PPContainsCh pkgid:chnumber is many:many or many:1
-- so PPContainsCh pkgid:chnumber is many:many
-- so pk (pkgid,chnumber)
-- PPContainsCT pkgid:chtypeid is many:many or many:1
-- so PPContainsCT pkgid:chtypeid is 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

我会让你思考什么&#34; can&#34;贡献。

  

我遇到的问题是程序包和频道之间的问题。一世   似乎无法找到在两者之间起作用的关联表。

你有事情倒退。首先找到陈述。每个语句都给出一个表格。陈述和情况给出了限制。

编辑:程序具有通道类型。因此,大概它所播放的频道应该是那种频道类型等等。你的问题没有提到这个方面对于一个节目意味着什么(允许?)&#34;频道类型,用于节目&#34;到(被允许?)播放&#34;一个频道或一个频道类型或节目包到&#34;包含一个(允许的?)&#34;信道。