【问题标题】:Do I have to list all the possible FK in the database design?我是否必须在数据库设计中列出所有可能的 FK?
【发布时间】:2012-11-09 03:45:01
【问题描述】:

情况如下:

我有一个记录CUSTOMER和ORDER、INVOICE、PAYMENT等关系的数据库。

我目前的设计是:CUSTOMER 链接到 ORDER,ORDER 链接到 INVOICE,INVOICE 链接到 PAYMENT。

我的问题是,我实际上想知道哪个客户正在处理订单、发票和付款。那么我是否必须将 CUSTOMER_ID 放在我想将 CUSTOMER 显示为 FK 的每个表中?会吗

或者我可以通过查询来呈现它?

【问题讨论】:

    标签: sql database


    【解决方案1】:

    不,你没有。如果您的目标是遵循正确的数据库设计并避免冗余数据存储,您应该只编写一个包含多个连接的查询。

    例如:

    SELECT c.CUSTOMER_ID, ..., p.PAYMENT_ID, ...
    FROM CUSTOMER c,ORDER o,INVOICE i,PAYMENT p
    WHERE c.CUSTOMER_ID = o.CUSTOMER_ID
    and o.ORDER_ID = i.ORDER_ID
    and i.INVOICE_ID = p.INVOICE_ID 
    

    【讨论】:

    • 是的,当然。以这种方式创建涵盖查询“遍历”表的两个连接列的索引可能有助于提高性能。例如,order.order_id 和 order.customer_id 上的索引,因为它避免了访问表以进行此类查询的需要。
    • 我同意您的回答,但这是加入您的表格的一种非常糟糕的方式。但是我不同意您的示例,您应该使用连接关键字INNER JOIN LEFT OUTER JON 等。类似select * from customer as c inner join order as o on c.customer_id = o.customer_id inner join invoice as i etc
    • 它做同样的事情。我更喜欢使用 = 然后 'inner join' 因为语法更简约
    • 最好明确地表明你的意图,总是想想以后要维护你的代码的人......
    • 公平地说,我认为它不会影响执行计划,但就个人而言,它很难阅读,而且查询试图做什么也不太明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多