【问题标题】:How to reference an unknown number of rows from another table in sql?如何从sql中的另一个表中引用未知数量的行?
【发布时间】:2020-11-05 10:07:41
【问题描述】:

我正在为我父母的比萨店开发一个系统。我的编程经验很少,我想做一个像样的 SQL 数据库,这样当我在编码方面变得更好时,它会更容易维护和改进。

到目前为止,我想出了以下内容(使用 db 浏览器帮助我进行可视化):

CREATE TABLE IF NOT EXISTS "client" (
        "id"    INTEGER,
        "name"  TEXT,
        "phone" TEXT,
        "neighborhood"  TEXT,
        "address"       TEXT,
        PRIMARY KEY("id")
);
CREATE TABLE IF NOT EXISTS "product" (
        "id"    INTEGER,
        "type"  TEXT,
        "flavour"       TEXT,
        "ingredients"   TEXT,
        "price" REAL,
        PRIMARY KEY("id")
);

我将创建第三个表"order",并且想知道当客户订购多个产品时我如何引用多个product.id

【问题讨论】:

  • 您需要一个订单标题表,然后是一个订单明细表,该表将有一个产品列,并且每个订单可以有很多行。
  • 请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和站点:stackoverflow.com & 标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • 现在您只是要求我们用定制教程重写教科书。是时候关注已出版的关于信息建模、关系模型和数据库设计与查询的学术教科书了。 (记录和使用设计的语言和工具手册不是这样的教科书。)(维基文章或网络帖子也不是。)。数十个在线免费的 pdf 格式。问 1 个具体研究过的非重复问题卡在哪里。PS 什么是“参考”以及为什么要这样做? PS PK、FK 和其他约束不需要保持、知道或声明即可查询。

标签: sql sqlite database-design ddl create-table


【解决方案1】:

您正在做的一些事情是数据建模。

  • 客户可以有多个订单。
  • 订单可以有多个产品。
  • 产品可以有多种成分。

所以order 表可能看起来像...

CREATE TABLE IF NOT EXISTS "order" (
    "OrderId"    INTEGER,
    "ClientId"   INTEGER,
    "ProductId"  INTEGER,
    "OrderDate"  DATETIME,
    "ScheduledDelivery" DATETIME,
    "ActualDelivery" DATETIME,
    "ProductQty" INTEGER,
    PRIMARY KEY("OrderId")
);

如果您希望数据库强制执行参照完整性,您可以添加 FOREIGN KEY 约束。 (订单可以有不在product 表上的产品吗?不在client 表上的人可以下订单吗?)

我会调整clientproduct 中的列名(并添加一些),以使您以后的代码更清晰。

您的最后一个问题似乎是关于如何设计查询。您应该学习一些基本的 SQL 技能。 (从您提供的 DDL 代码来看,您似乎进展顺利。)

在 SQL Server 中,示例查询可能如下所示:

select c.ClientName
, o.OrderDate
, p.ProductType
, p.ProductFlavour
from client c
  inner join order o on o.ClientId = c.ClientId
  inner join product p on p.ProductId = o.ProductId
where o.OrderDate

(我没用过sqlite,所以不知道有没有翻译问题。)

有很多书籍和网站可以帮助您进行数据建模和查询设计。

【讨论】:

    【解决方案2】:

    教科书的解决方案是创建一个映射表来关联产品和订单。

    CREATE TABLE IF NOT EXISTS "orders" (
            "id"         INTEGER,
            "order_date" DATETIME,
            -- Any other columns you may need
            PRIMARY KEY("id")
    );
    
    CREATE TABLE IF NOT EXISTS "order_products" (
            "product_id" INTEGER,
            "order_id"   INTEGER,
            FOREIGN KEY("product_id") REFERENCES product("id"),
            FOREIGN KEY("order_id")   REFERENCES orders("id"),
            PRIMARY KEY("product_id", "order_id")
    );
    

    【讨论】:

    • 一个订单有一个客户和一个或多个产品。所以order 表应该有对其他两个表的引用。不需要桥接表或映射表。
    • 啊。我明白你的意思。您可以将订单标题信息与客户、订单日期、订单总额等项目一起存储,并且仅将 id 加入详细信息以获取产品、产品数量等。这样可以节省空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多