以下数据库设计的优缺点是什么?

时间:2010-09-04 23:00:58

标签: sql-server database tsql database-design relational-database

我期待有关以下设计的建议和意见。所有表都应该是大表(数百万条记录),并且经常更新和查询,允许任何类型的更新(更新,插入,删除)。

-- 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)

2 个答案:

答案 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)还不够?您想为每个订单在该字段中插入小说吗?