我有一个表关系,我似乎无法解决一对多的关系,我想知道是否有人可以提供一些建议。
这是我正在上学的案例研究。该数据库正在为一家电视广播公司(类似于Comcast,DirecTV等)编写。我的大多数表都很好,除了编程表。这是我目前的进度。
一个程序可以在一个或多个频道上播放。一个频道可以播放一个或多个节目。 (共有10个频道)一种通道类型可以包含一个或多个通道。 (有5种类型中的2种,每种类型分配了2个特定的通道)。一个编程包可以包含一个或多个通道(或通道类型)。一个频道(或频道类型)可以出现在一个或多个编程包中。
我目前将其组合在一起的方式是这样的:
Programs ->-----|-- Channel Type --|-----< Channel --????----Program Package
-progid (PK) -chtypeid (PK) -chnumber (PK) -pkgid (PK)
-progname -chtypedesc -chtypeid (FK) - pkgname
-progdesc -price
-chtypeid (FK)
我遇到的问题在程序包和频道之间。我似乎找不到在两者之间起作用的关联表。
希望我已经解释得足够好了。我发布了我当前的ERD图片,但显然我的声誉还不够高。
任何人都可以就我可能缺少的内容提供一些建议吗?
谢谢。
现在和缺席的每一行都发表声明。只需编写您需要描述应用程序情况的语句模板即可。
表具有关联的参数化语句(proposition)模板(predicate)。表列是模板参数。使模板变为真实语句的行是表中的行。其他/缺席的行则作出错误的陈述。所有表的所有当前存在和不存在的行一起描述了当前情况。
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约束已给出根据您找不到的“关联表”的模板。
一个程序可以在一个或多个频道上播放。
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)
((共有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 (chtypeid)
((5种类型中有2种,为每种类型分配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 [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
我会让您考虑“能”做出什么贡献。是否应该说一个实体也可以与其他0个对象关联?
我遇到的问题在程序包和频道之间。一世似乎找不到在两者之间起作用的关联表。
您的情况倒退。首先找到语句模板。每个模板都有一个表格。模板加情境给出了约束。 (然后,我们可能会合并,分解和/或删除表和/或约束。)
PS:程序具有频道类型。因此,假设它播放的频道应为该频道类型,依此类推。您的问题没有提到程序“拥有(允许?)”频道类型对于程序“至(允许播放?)在频道上播放,或在频道类型或节目包中播放以“包含(允许?)”频道。
您只需要Program Package
和Channel
之间的连接表
我会做类似的事情
CREATE TABLE PackageChannels(
pkgid VARCHAR(50) REFERENCES PROGRAMPACKAGE (pkgid),
chnumber VARCHAR(50) REFERENCES CHANNEL (chnumber),
PRIMARY KEY (pkgid, chnumber)
)
不知道您使用的是哪种SQL语法。但是答案是连接表
也欢迎您加入。
您可能要考虑说一个程序包仅由通道类型组成。每种频道类型都包含一个或多个频道,并且一个频道显示一个或多个节目。不同频道类型的多个频道可以显示同一节目。
如果频道必须是频道类型的一部分,则程序包和频道之间没有(直接)关系。
如果我正确理解了您的问题,则需要以下附加关联表。
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)