我期待有关以下设计的建议和意见。所有表都应该是大表(数百万条记录),并且经常更新和查询,允许任何类型的更新(更新,插入,删除)。
-- product
create table Product(
productID int not null identity(1,1),
name varchar(100) not null,
constraint PK_Product primary key(productID)
)
-- client
create table Client(
clientID int not null identity(1,1),
name varchar(100) not null,
constraint PK_Client primary key(clientID)
)
-- order
create table [Order](
orderID int not null identity(1,1),
clientID int not null,
orderDateTime datetime not null,
orderAmount money not null,
orderNote varchar(max) null,
constraint PK_Order primary key(orderID),
constraint FK_Order_Client foreign key(clientID) references Client(clientID)
)
exec sp_tableoption 'Order', 'large value types out of row', 0
create index IX_Order_client on [Order](clientID)
-- items
create table OrderItem(
orderItemID int not null identity(1,1),
orderID int not null,
productID int not null,
qty int not null,
amount money not null,
constraint PK_OrderItem primary key(orderItemID),
constraint FK_OrderItem_Order foreign key(orderID) references [Order](orderID),
constraint FK_OrderItem_Product foreign key(productID) references Product(productID)
)
create index IX_OrderItem on OrderItem(orderID)
答案 0 :(得分:2)
这看起来很不错。
您可能还希望获得订单总费用的任何折扣或增加的调整金额。目前还不是很清楚你打算如何处理你所显示的订单金额 - 通常,订单总额可以从所包含部分的总和中计算出来。
如果适用的话,还可以考虑使用船舶方法来指示订单的交付方式,如果订单需要几个步骤才能完成。
答案 1 :(得分:0)
1)对于OrderItem表,我认为最好存储单价和
添加金额的计算字段:Amount AS Qty*UnitPrice [PERSISTED]
。
另外,UnitPrice&的数据类型也是如此。金额字段很重要。你确定需要4位小数吗?仅使用2位小数(例如NUMERIC(8,2))不是更好吗?
2)此时,使用建议的设计,可以轻松地“复制”订单商品(订单ID和产品ID),因为OrderItem表没有任何限制:
Order (1001, ...)
OrderItem (1,1001,10,400,800),(2,1001,11,200,1200),(3,1001,10,400,800).
解决方案是添加一个唯一索引:
CREATE UNIQUE INDEX IUX_OrderItem_OrderID_ProductID
ON OrderItem (OrderID, ProductID)
在某些情况下,OrderID + ProductID可以重复,但UnitPrice会有所不同。 如果是这种情况,那么唯一索引将具有包含3个字段的键: CREATE UNIQUE INDEX IUX_OrderItem_OrderID_ProductID_UnitPrice ON OrderItem(OrderID,ProductID,UnitPrice)
3)如果SQL Server版本是> = 2005,那么您可以将模式用于数据库对象。
CREATE SCHEMA Sales;
CREATE TABLE Sales.[Order] (...);
CREATE TABLE Sales.OrderItem (...);
4)我的建议是不要在没有理由的情况下创建索引(IX_OrderItem):例如查询或限制。它们需要在每次DML操作时更新,并且需要存储空间。如果要创建索引,请尽可能创建唯一索引。
5)我不明白为Order表中的orderNote字段使用VARCHAR(MAX)数据类型的原因。 VARCHAR(8000)或NVARCHAR(4000)还不够?您想为每个订单在该字段中插入小说吗?