2012-03-07 79 views
1

我正在设计一个作为项目在线结账的数据库。这是我创建的第一个数据库,所以对我来说很容易。无论如何,我有表“帐户”,“订单”,“购物车”和“sku”。帐户包含运送信息,姓名,电话,电子邮件等。主键是accountNumber。订单保存帐单信息。它的外键是accountNumber,它的主键是OrderID。购物车只有2列 - orderID和skuNumber。 OrderID是外键,skuNumber是主键。 SKU有4列 - skuNumber,数量,价格,单位和totalPrice。 skuNumber是外国和主键。数据库设计帮助 - 在线结帐项目

我的问题是 - 我目前有这种设置的方式只能一次订购1件SKU。你如何设计这种不同的方式,这是没有必要的?我知道我可以做sku1,sku2等,但是这看起来好像违背了最佳实践。

谢谢!

回答

1

你的数据库是不是normaized通过这样的设计,而不是SKU表,您将需要两个额外的表,becouse你只需要分开prodcts细节(Nameprice,等...),从订单的详细信息,所以你必须添加以下表:

产品:

  • Id
  • Name
  • Price
  • ...

另外一个OrderItemsSKUItems包含以下几列:

  • OrderID外键订单表。
  • ProductId产品表的外键。
  • Quantity
  • ...

我不明白SKU是,但如果它是某种产品类型的,你可以添加额外的表ProductTypes: Id, name保存产品类型,这个表包含例如产品类型所谓SKU那么你可以添加一个ProductTypeIdProducts,所以你可以有这样的:

ProductTypeId | Name 
------------------------ 
     1   SKU 

对于Products表:

ID | Name | ProductTypeId 
----------------------------- 
1  SKU1  1 
2  SKU2  1 
3  SKU3  1 
+0

我应该对OrderItems表中的主键有什么要求?另外,SKU就像条形码。 – cmorris1441 2012-03-07 16:28:43

+0

@ cmorris1441,那么,你有两个选择,第一个是使用两个字段'ProductId'和'OrderId'作为主键,第二个是使用[Surrogate Key](http://en.wikipedia.org/wiki)/Surrogate_key)就像'OrderItemId'。 – 2012-03-08 00:37:23

+0

我不喜欢OrderItemTable中的productId的想法。如果产品更改了产权,价格或其他财产,该怎么办?OrderItem可以在提交订单后持续数月,甚至在历史中。那将是一个令人误解的订单历史页面 – 2017-10-09 11:17:06