【问题标题】:SQL Design Relationship - Many to Many resolutionSQL 设计关系 - 多对多分辨率
【发布时间】:2014-08-04 05:30:52
【问题描述】:

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

这是一个我正在为学校工作的案例研究。该数据库是为一家电视广播公司(类似于 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)

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

希望我已经对此进行了充分的解释。我会发布我当前 ERD 的照片,但显然我的声誉还不够高。

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

谢谢。

【问题讨论】:

  • 您并没有说您正在尝试找到一种方法来根据给定的表格来表达某些特定的表格含义。或者这意味着什么。或者 given 的含义是什么。当您写“一个节目可以在一个或多个频道上播放”时,这与表格有什么关系?其中一个是否包含“程序 [p] 可以在频道 [c] 上播放”的行? (A:没有。)是否可能包含“节目 [p] 可以在频道类型 [t] 的频道上播放”的行?也许,程序?你不说。我们无法读懂你的想法。我们如何处理这个数量约束?是不是为了一些含义&表?

标签: sql entity-relationship database-schema


【解决方案1】:

您只需要Program PackageChannel 之间的联结表

我会做类似的事情

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

不知道您使用的 SQL 是什么风格的语法可能是错误的。但答案是Junction Table

另外,欢迎来到 SO。

【讨论】:

  • 我们一开始就有这种连接表,但班上的教授拒绝了它,说它不需要,可以用现有的表来解决关联。我需要对这种类型的路口进行查询,但显然这不是他想要的。
  • 您是否仅限于之前列出的四个表?
  • 没有。我只列出了与我遇到的问题直接相关的表格。如果我没记错的话,数据库中总共有 11 或 12 个表。但是列出的那些是 Program to Type 到 Channel to Package 关系行中唯一的那些。
  • 好的,教授的期望是,您无需任何额外内容即可建立所描述的关系。
【解决方案2】:

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

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

【讨论】:

  • 我认为这是问题的关键。在通道和包之间移动通道类型并扩展通道类型中的记录应该可以使其工作。目前我在通道类型中插入了十条记录(每个通道一种类型..example chtypeid 501 = channel 1)。但是,如果我将包中通道的每个实例的通道类型扩展为一条记录,那么我认为查询将起作用。(例如 chtypeid "pkgname"501 = channel 1)。
【解决方案3】:

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

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

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

【讨论】:

  • 目前 Program 中的记录包含一个链接到 Channel 表的“chnum”FK。所以 progid 有一个指向 Channel 表的链接。是否有某些原因导致这行不通,或者我们只是在谈论写作风格的不同??
  • 根据你的描述,节目和频道之间是n对n的关系。在那种情况下 chnum 不能在 Program 表中,这个链接必须移动到关联表中。
【解决方案4】:

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

将 chtypeid(FK) 添加到 Program Package 中,您将通过 ChannelType 在 Program Package 和 Channel 之间建立多对多关系。

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

【讨论】:

    【解决方案5】:

    在场和缺席的每一行都有一个声明。只需编写您需要的语句模板来描述您的应用情况。

    一个表有一个相关的参数化语句(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 个特定通道)。

    -- [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:一个节目有一个频道类型。所以大概它播放的频道属于那种频道类型,等等。你的问题没有提到节目“拥有(允许的?)”频道类型意味着什么的这个方面,对于一个节目“到(被允许?)在“频道上播放”或频道类型或节目包“包含(允许?)”频道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多