如何从 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 上的人可以下订单吗?)
我会调整 client
和 product
中的列名称(并添加一些)以使您以后的代码更清晰。
您的最后一个问题似乎是关于如何设计查询的。您应该学习一些基本的 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,所以我不知道是否有任何翻译问题。)
有很多书籍和网站可以帮助您进行数据建模和查询设计。
我正在为我的 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 上的人可以下订单吗?)
我会调整 client
和 product
中的列名称(并添加一些)以使您以后的代码更清晰。
您的最后一个问题似乎是关于如何设计查询的。您应该学习一些基本的 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,所以我不知道是否有任何翻译问题。)
有很多书籍和网站可以帮助您进行数据建模和查询设计。