我想在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被视为“订单项”。
我的问题是:关于“订单项”定义这些表的正确方法,还是有更好的方法?
答案 0 :(得分:2)
您对订单项的设计不正确。
考虑到正如一个客户有一个或多个订单,每个订单都有一个或多个订单项。因此,您应该为订单本身设置一个表,为订单项设置单独的表。这两个表之间唯一重复的列应该是唯一标识订单的列(或列)。
在您展示的设计中,这意味着将PCS,Pattern,Style_Name和Price与Order_Nbr(如果仅此一项足以识别订单)或者Cust_ID和Order_Nbr分开。 p>
还要考虑一个客户可能有不同送货地址的订单,送货地址或帐单地址可能会随着时间的推移而变化,而送货地址和帐单地址实际上只是同一实体的实例(有点事情)而你可以看到您可能需要一个单独的表来保存链接到客户的地址。
您可能还需要考虑其他问题(例如存储信用卡信息的可取性),但这应该可以帮助您入门。