如何从 sql 中的另一个 table 引用未知数量的行?

How to reference an unknown number of rows from another table in sql?

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

到目前为止我已经想出了以下内容(使用数据库浏览器帮助我可视化):

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")
);

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

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

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 table 可能看起来像...

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 table 上的产品吗?不在 client table 上的人可以下订单吗?)

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

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

在 SQL 服务器中,示例查询可能如下所示:

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,所以我不知道是否有任何翻译问题。)

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