SQL设计关系-多对多分辨率

问题描述 投票:0回答:5

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

这是我正在上学的案例研究。该数据库正在为一家电视广播公司(类似于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图片,但显然我的声誉还不够高。

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

谢谢。

sql entity-relationship database-schema
5个回答
1
投票

现在和缺席的每一行都发表声明。只需编写您需要描述应用程序情况的语句模板即可。

表具有关联的参数化语句(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:程序具有频道类型。因此,假设它播放的频道应为该频道类型,依此类推。您的问题没有提到程序“拥有(允许?)”频道类型对于程序“至(允许播放?)在频道上播放,或在频道类型或节目包中播放以“包含(允许?)”频道。


0
投票

您只需要Program PackageChannel之间的连接表

我会做类似的事情

CREATE TABLE PackageChannels(
    pkgid VARCHAR(50) REFERENCES PROGRAMPACKAGE (pkgid),
    chnumber VARCHAR(50) REFERENCES CHANNEL (chnumber),
    PRIMARY KEY (pkgid, chnumber)
)

不知道您使用的是哪种SQL语法。但是答案是连接表

也欢迎您加入。


0
投票

您可能要考虑说一个程序包仅由通道类型组成。每种频道类型都包含一个或多个频道,并且一个频道显示一个或多个节目。不同频道类型的多个频道可以显示同一节目。

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


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

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


0
投票

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

将chtypeid(FK)添加到程序包中,您将通过ChannelType在程序包和通道之间建立多对多关系。

Programs Package >-----|------ Channel Type ------|-----< Channel 
-pkgid (PK)                    -chtypeid (PK)             -chnumber (PK)        
-pkgname                       -chtypedesc                -chtypeid (FK)       
-price                                                         
-chtypeid(FK)   
© www.soinside.com 2019 - 2024. All rights reserved.