【问题标题】:Is it really necessary to create foreign key in this query?真的有必要在这个查询中创建外键吗?
【发布时间】:2015-07-26 21:29:17
【问题描述】:

我有一个名为 Investors 的表,其主键为 ID。我还有其他名为 Users Login_Logs 和 Accounts 的表。所有这些表都包含外键investor_id。在投资者和用户之间,我们有一对一的关系。投资者和 Login_Logs 之间是一对多关系,投资者和帐户之间也是一对多关系。我的问题是为了创建一个查询来加载表用户、登录日志和帐户中包含的信息 - 我是否需要在投资者表中存储用户 ID、帐户 ID 和登录日志 ID?我的意思是,我需要在投资人表中为所有列创建外键吗?

【问题讨论】:

    标签: mysql join foreign-keys entity-relationship


    【解决方案1】:

    不,外键约束不会影响连接和读取查询。它们确保子列中的值存在于引用的列中。它们用于完整性,而不是用于链接行或表。

    AFAICT 在您的投资人表中记录用户 ID 是多余的,在投资人中记录帐户和登录日志 ID 是不切实际的。

    为了能够有效地连接表,您需要为每个表中的investor_id 编制索引。然后,由您的查询根据需要连接表。

    同时检索有关投资者的所有信息的问题在于您有(多个)一对多关系。如果我们加入所有表:

    SELECT *
    FROM investors i
    JOIN users u ON i.ID = u.investor_id
    JOIN accounts a ON i.ID = a.investor_id
    JOIN login_logs l ON i.ID = l.investor_id
    

    然后,如果投资者有 2 个帐户和 2 个 login_logs,那么我们将得到 4 行。 SQL 数据库不能嵌套相关数据。相反,您可能必须使用 3 个查询来检索有关投资者的所有信息:

    SELECT *
    FROM investors i
    JOIN users u ON i.ID = u.investor_id
    
    SELECT *
    FROM accounts
    
    SELECT *
    FROM login_logs
    

    然后在代码中处理结果。您可以以编程方式处理上述组合查询,但它有点复杂。

    【讨论】:

    • 我很确定我理解了你的答案,但现在的重点是如何在 sequelize 中创建一个查询,以有效地检索所有投资者,同时检索其他表中的所有信息。你有什么想法吗?
    • 我的查询应该是选择所有投资者并显示在与每个投资者相关的其他表格的信息中
    • 但我不知道如何在不在投资人表中创建外键的情况下在续集中执行此操作。它应该以另一种方式存在
    • 是的,SQL 不能嵌套相关数据是事实,但如果你可以使用docs.sequelizejs.com/en/latest/docs/models-usage/#eager-loading 那样的话,你可以嵌套数据,如果我将外键放在投资者内部,我可以做一些事情像这样
    • 抱歉,我对 Sequelize 一无所知,也不关心学习 ORM。也许一个关注 Sequelize 查询的新问题是有序的。
    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    相关资源
    最近更新 更多