如果查询数据库太复杂,是不是数据库设计不好?

bag*_*Man 4 sqlite database-design design-pattern

我是数据库的新手,下面是我的一个查询及其解释,我觉得它太复杂了。它有效,但我担心设计不好。

为购买了数据库中最赚钱的作者所写的任何内容的客户提供客户信息列表。

SELECT E.id,NAMES.fname, NAMES.lname, E.address, E.city, E.state,E.country,    E.email, E.phone, E.postalcode
FROM ENTITY AS E, (SELECT DISTINCT T.customer_id
               FROM (SELECT  DISTINCT O.order_id
                     FROM ORDERITEM AS O
                     WHERE O.bid IN (SELECT DISTINCT A.b_id
                                     FROM AUTHOR AS A
                                     WHERE A.name_id IN (SELECT DISTINCT NA.name_id
                                                         FROM (SELECT A.name_id, A.b_id
                                                               FROM (AUTHOR AS A JOIN NAMES AS N ON (A.name_id = N.id))
                                                               GROUP BY A.name_id) AS NA,(SELECT B.b_id AS bid, max(C.total_quantity * B.price), B.title
                                                                                          FROM BOOK AS B, (SELECT bid, SUM(quantity) AS total_quantity
                                                                                                           FROM ORDERITEM AS O
                                                                                                           GROUP BY O.bid) AS C
                                                                                            WHERE B.b_id = C.bid) AS BD
                                                         WHERE NA.b_id = BD.bid))) AS OID JOIN ORDER_TRANSACTION AS T ON (OID.order_id = T.order_id)) AS TID, NAMES
WHERE TID.customer_id = E.id AND
NAMES.id = E.name_id
Run Code Online (Sandbox Code Playgroud)

这是我的设计,看起来很简单。

在此处输入图片说明

小智 5

答案是:分而治之!每个子查询都应该成为它自己的查询(或视图)。谨慎使用子查询。请改用 JOIN。

您至少需要一个查询(使用 JOIN):

  • 作者

  • 顾客

  • ...

然后您可以独立测试您的查询或视图(如果您遇到问题,这非常有用)。