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

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

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

  1. CREATE TABLE IF NOT EXISTS "client" (
  2. "id" INTEGER,
  3. "name" TEXT,
  4. "phone" TEXT,
  5. "neighborhood" TEXT,
  6. "address" TEXT,
  7. PRIMARY KEY("id")
  8. );
  9. CREATE TABLE IF NOT EXISTS "product" (
  10. "id" INTEGER,
  11. "type" TEXT,
  12. "flavour" TEXT,
  13. "ingredients" TEXT,
  14. "price" REAL,
  15. PRIMARY KEY("id")
  16. );

我将创建第三个表 "order" 想知道我怎么能引用多个 product.id 当客户订购多个产品时?

oyjwcjzk

oyjwcjzk1#

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

  1. CREATE TABLE IF NOT EXISTS "orders" (
  2. "id" INTEGER,
  3. "order_date" DATETIME,
  4. -- Any other columns you may need
  5. PRIMARY KEY("id")
  6. );
  7. CREATE TABLE IF NOT EXISTS "order_products" (
  8. "product_id" INTEGER,
  9. "order_id" INTEGER,
  10. FOREIGN KEY("product_id") REFERENCES product("id"),
  11. FOREIGN KEY("order_id") REFERENCES orders("id"),
  12. PRIMARY KEY("product_id", "order_id")
  13. );
nfeuvbwi

nfeuvbwi2#

您正在做的一些工作是数据建模。
客户可以有多个订单。
订单可以有多个产品。
产品可以有多种成分。
所以 order table看起来像。。。

  1. CREATE TABLE IF NOT EXISTS "order" (
  2. "OrderId" INTEGER,
  3. "ClientId" INTEGER,
  4. "ProductId" INTEGER,
  5. "OrderDate" DATETIME,
  6. "ScheduledDelivery" DATETIME,
  7. "ActualDelivery" DATETIME,
  8. "ProductQty" INTEGER,
  9. PRIMARY KEY("OrderId")
  10. );

如果希望数据库强制引用完整性,可以添加外键约束(订单上能不能有不在订单上的产品 product table?一个不在场的人 client (下订单?)
我会在中调整列名(并添加一些) client 以及 product 使您未来的代码更清晰。
最后一个问题似乎是关于如何设计查询。您应该学习一些基本的sql技能(从您提供的ddl代码来看,您似乎已经走上了正轨。)
在sql server中,示例查询可能如下所示:

  1. select c.ClientName
  2. , o.OrderDate
  3. , p.ProductType
  4. , p.ProductFlavour
  5. from client c
  6. inner join order o on o.ClientId = c.ClientId
  7. inner join product p on p.ProductId = o.ProductId
  8. where o.OrderDate

(我从未使用过sqlite,所以我不知道是否存在任何翻译问题。)
有很多书籍和网站可以帮助您进行数据建模和查询设计。

展开查看全部

相关问题