如何正确设计此SQLite数据库?

时间:2012-05-21 22:52:31

标签: sqlite

我想在SQLite中创建一个包含两个表的数据库:Customer和Orders。每个客户可以有很多订单; (我知道这是一对多的关系)。除了信用卡信息,条款和运输信息(非地址类型信息)之外,每个订单可以包含许多“订单项”(订单项是“商品”的特定订单)。我需要能够找到任何特定客户的所有订单,但不必根据订单找到客户。

这是我目前为Customer表所做的:

[db executeUpdate:@"CREATE TABLE IF NOT EXISTS CustData ("
 "BUS_NAME TEXT PRIMARY KEY NOT NULL, "
 "EMAIL TEXT, "
 "PHONE TEXT, "
 "SHOP_NAME TEXT, "
 "SHOP_ADDR1 TEXT, "
 "SHOP_ADDR2 TEXT, "
 "SHOP_CITY_STATE TEXT, "
 "SHOP_ZIP TEXT, "
 "SHIP_NAME TEXT, "
 "SHIP_ADDR1 TEXT, "
 "SHIP_ADDR2 TEXT, "
 "SHIP_CITY_STATE TEXT, "
 "SHIP_ZIP TEXT, "
 "NOTES TEXT)"];

这就是我对Order表的要求:

[db executeUpdate:@"CREATE TABLE Orders ("
 "CUST_ID TEXT REFERENCES CustData, "
 "ORDER_NBR TEXT, "
 "SALES_NAME TEXT, "
 "CREDIT_CARD TEXT, "
 "EXP_DATE TEXT, "
 "CID TEXT, "
 "NOTES TEXT, "
 "PCS INTEGER, "
 "PATTERN TEXT, "
 "STYLE_NAME TEXT, "
 "PRICE DECIMAL)" ];

PCS,Pattern,Style_Name和Price被视为“订单项”。

我的问题是:关于“订单项”定义这些表的正确方法,还是有更好的方法?

1 个答案:

答案 0 :(得分:2)

您对订单项的设计不正确。

考虑到正如一个客户有一个或多个订单,每个订单都有一个或多个订单项。因此,您应该为订单本身设置一个表,为订单项设置单独的表。这两个表之间唯一重复的列应该是唯一标识订单的列(或列)。

在您展示的设计中,这意味着将PCS,Pattern,Style_Name和Price与Order_Nbr(如果仅此一项足以识别订单)或者Cust_ID和Order_Nbr分开。 p>

还要考虑一个客户可能有不同送货地址的订单,送货地址或帐单地址可能会随着时间的推移而变化,而送货地址和帐单地址实际上只是同一实体的实例(有点事情)而你可以看到您可能需要一个单独的表来保存链接到客户的地址。

您可能还需要考虑其他问题(例如存储信用卡信息的可取性),但这应该可以帮助您入门。