【问题标题】:Postgres multiple joinsPostgres 多重连接
【发布时间】:2012-01-08 18:10:45
【问题描述】:

这是一个 postgres 数据库。我正在尝试从品种表中提取犬种名称(Cane Corso、Labrador 等),以根据动物表中的外键进行显示。我的问题是动物表对这个单一品种表有两个外键,我的查询不断出错。第一个品种名称将基于左连接返回,但第二个我无法显示名称,因为我已经有左连接。以下是我正在尝试做的简化大纲:

breed table (ID, BreedName)
animal table (ID, breedID, breed2ID)

SELECT animal.ID, breed.BreedName FROM animal LEFT JOIN breed ON animal.breedID=breed.ID WHERE animal.ID='7';

我需要做的也是让 BreedName 加入 animal.breed2ID,但我失败了。我可以轻松地对品种名称进行硬编码并将其显示在应用程序中,但这不利于在数据库中更改、添加或删除品种名称。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    只需在同一张表上进行另一个联接:

    SELECT animal.ID, breed1.BreedName as BreedName1, breed2.BreadName as BreadName2 
    FROM animal 
       LEFT JOIN breed as breed1 ON animal.breedID=breed1.ID 
       LEFT JOIN breed as breed2 ON animal.breedID=breed2.ID 
    WHERE animal.ID='7';
    

    【讨论】:

    • 非常感谢。这澄清并完全按计划工作!我只是通过做一个品种.动物名称作为品种名称1,品种.动物名称作为品种名称2来搞砸它。完全错过了表的别名!再次感谢,这是我在技术网站上看到的最好的帮助!
    • 嘿没问题,这就是我们在这里的原因:D 我也同意 StarShip3000 的帖子。但我认为不会发生具有 3 个或更多品种的狗。但如果他们这样做,那么一定要采取 Star 推荐的方法。
    • 确保使用解释分析来确保您无法从自然连接中获得更好的速度。你会感到惊讶。
    【解决方案2】:

    虽然 Ivan 已经为您当前的数据库设计解决了您的问题,但长期考虑或只是一个值得学习的事情是让您的表设计更加规范化,这样每次您想要添加品种时都必须添加新的联接对动物来说是不必要的。通过这个简单的设计,你实际上让你的生活变得更加艰难。

    当您在实体上看到重复的属性类型时,在您的情况下是品种 ID 和品种2ID,除了极少数情况外,您通常应该开始闻到一些腐烂的东西。

    在理想设计下,您将执行以下操作。

    1.保持你的品种不变。

    2.让动物看起来像动物(animal_id,animal_name)。

    3.添加一个新的animal_breed 表。它看起来像这样的 animal_breed(animal_breed_id,animal_id,breed_id)。 Animal_bread_id 是一个 pk 和 (animal_id,breed_id) 上的唯一键,外键指向各自的表。

    这种设计允许给定的动物采用一种或多种品种类型,而不必弄乱您的查询以返回多个品种。每当您拥有一个带有额外品种的动物时,您当前的设计就会成为一场噩梦。它有可能会降低性能并使维护成为一场噩梦,而且最重要的是,它的数据库设计并不完善。

    【讨论】:

    • 有哪些罕见的情况下,所讨论的架构设计是正确的选择?
    • 根据我的经验,如果您遇到某种性能壁垒,或者您有足够的经验知道您正在处理的用例将需要这种类型的设计来处理处理和数据您期望的音量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多