0

我期待的關於以下設計的建議和評論。預期所有表格都是大型表格(數百萬條記錄),並經常更新和查詢,並允許任何類型的更新(更新,插入,刪除)。以下數據庫設計的優缺點是什麼?

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

你需要做什麼樣的查詢? – 2010-09-04 23:03:55

+0

'OrderItem'在會計/發票中通常被稱爲'LineItem' – 2010-09-04 23:29:49

+0

這個假設的設計適用於POS系統Mark。有更新,插入,訂購歷史庫存,AR查詢等 – 2010-09-04 23:30:00

回答

2

這看起來不錯。

您也可以對訂單的總費用進行折扣或增加調整金額。您打算如何處理您所顯示的訂單金額並不十分清楚 - 通常,訂單總額可以從包含的部分總和中計算。

此外,如果適用,還考慮用於指示訂單如何交付的發運方法,如果訂單需要幾個步驟來完成,則可能是狀態。

+0

感謝蘭迪的評論 – 2010-09-04 23:27:05

0

1)對於OrderItem表,我認爲最好存儲單價,並以 爲金額添加計算字段:Amount AS Qty*UnitPrice [PERSISTED]。 此外,UnitPrice &數量字段的數據類型很重要。你確定你需要4位小數?使用2位小數不會更好(例如NUMERIC(8,2))嗎?

2)此時,使用提出的設計,可以「複製」命令項(訂單ID &產品ID)easyly因爲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) 

在某些情況下,訂單ID +產品ID可以被複制,但單價將diferent。 如果您遇到這種情況,那麼唯一索引將有3場關鍵: 創造出獨特的INDEX IUX_OrderItem_OrderID_ProductID_UnitPrice ON OrderItem的(訂單ID,產品ID,單價)

3)如果SQL Server版本爲> = 2005,那麼你可能使用數據庫對象的模式。

CREATE SCHEMA Sales; 
CREATE TABLE Sales.[Order] (...); 
CREATE TABLE Sales.OrderItem (...); 

4)我的建議是沒有理由不創建索引(IX_OrderItem):例如查詢或限制。他們需要在每個DML操作中更新,並且需要存儲空間。如果你想創建索引,儘可能創建唯一的索引。

5)我不明白爲Order table中的orderNote字段使用VARCHAR(MAX)數據類型的原因。 VARCHAR(8000)或NVARCHAR(4000)是不夠的?您想爲每個訂單在該字段中插入一本小說嗎?

相關問題