我有一个表格关系,我似乎无法解决一对多,我想知道是否有人可以提供一些建议。
这是我正在上学的案例研究。该数据库是为一家电视广播公司编写的(类似于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的图片,但显然我的声誉还不够高。
任何人都可以就我可能缺少的东西提供一些建议吗?
感谢。
答案 0 :(得分:0)
您只需要Program Package
和Channel
我会做像
这样的事情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;信道。