【问题标题】:Is it possible to force a relationship to be one-to-one instead of one-to-many? if not, then what?是否可以强制关系成为一对一而不是一对多?如果没有,那又怎样?
【发布时间】:2021-02-16 16:43:51
【问题描述】:

我有一个数据库任务很快就要到期了,我在错误的事情上浪费了很多时间。

为了简单起见,我有一个名为 Character 的表,它从许多表中提取信息,其中一个是 Inventory。 Character 和 Inventory 都有一个名为 inventory_ID 的字段,它是 Inventory 表中的 PK。

SELECT gold, char_name
FROM Inventory, Character

我尝试编写一个查询来从每个字符中获取金币,因此,例如:

character 1 : 200 gold
character 2 : 500 gold

它显示:

character 1 : 200 gold
character 1 : 500 gold
character 2 : 200 gold
character 2 : 500 gold

在建立关系时,我注意到我无法手动更改类型。大多数时候,这很好,但是对于这个,我认为问题在于库存与角色具有一对多的关系,因此每个角色都有一个库存(?)。

我已经为此苦苦挣扎了一段时间,时间不多了,我不想求助于寻求帮助,但我没有其他选择。

【问题讨论】:

标签: sql database ms-access database-design inner-join


【解决方案1】:

为了补充@GMB 答案,您可以将Characters 表中Inventory_Id 字段的Indexed 设置为Yes(No Duplicates)。这将防止在 MS Access 的表级别上添加重复的 Inventory_Id。这将为您提供一对一的关系。

【讨论】:

    【解决方案2】:

    您的代码生成两个表的笛卡尔积。相反,您需要join,使用公共列inventory_id 来关联两个表的行:

    select i.gold, c.char_name
    from inventory as i
    inner join character as c on c.inventory_id = i.inventory_id
    

    如果character 可能在inventory 中有多个匹配项,则可能需要聚合:

    select sum(i.gold) as gold, c.char_name
    from inventory as i
    inner join character as c on c.inventory_id = i.inventory_id
    group by c.char_name
    

    但是,这不是您的问题所暗示的。第一个查询应该做你想做的。

    【讨论】:

    • 这确实解决了我的查询问题,但它解决了问题吗?一对一的关系不是更有意义吗,因为一个角色应该有一个库存并且每个库存应该只属于一个角色?不过,非常感谢您的即时回复,不胜感激!
    • @MagorTuga:好吧,如果您确实有 1-1 关系,那么规范化原则会主张将两个表合并在一起。
    • 所以,我认为问题在于表格需要分开,而不是我这样做的方式,对吗?我是否应该信任 Access 才能准确了解正确的关系是什么?
    • @MagorTuga:好吧,鉴于您当前的设计,您做得不对。我的回答解释了为什么,以及如何做。修复架构本身也很好,尽管这是一个不同的问题。
    猜你喜欢
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 2011-03-30
    • 2011-01-28
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多