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

rta7y2nd  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(460)

我在为我父母的比萨店开发一个系统。我几乎没有编程经验,我想做一个像样的sql数据库,这样当我在编码方面做得更好时,维护和改进就会更容易。
到目前为止,我提出了以下建议(使用db browser帮助我可视化):

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 当客户订购多个产品时?

oyjwcjzk

oyjwcjzk1#

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

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

nfeuvbwi2#

您正在做的一些工作是数据建模。
客户可以有多个订单。
订单可以有多个产品。
产品可以有多种成分。
所以 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")
);

如果希望数据库强制引用完整性,可以添加外键约束(订单上能不能有不在订单上的产品 product table?一个不在场的人 client (下订单?)
我会在中调整列名(并添加一些) client 以及 product 使您未来的代码更清晰。
最后一个问题似乎是关于如何设计查询。您应该学习一些基本的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,所以我不知道是否存在任何翻译问题。)
有很多书籍和网站可以帮助您进行数据建模和查询设计。

相关问题