2009-07-05 78 views
1

我有一個包含兩個表的數據庫; List和ListItem。這些表格具有一對多的關係。但是一個要求是允許與給定列表相關的ListItems被排序。除了在ListItem表中有一個「排序順序」字段,對此有什麼好的方法?DB架構:維護項目訂單

+0

這與asp.net-mvc無關 – 2009-07-05 13:54:37

回答

0

如果您被要求提供排序或序列字段以外的方法,那麼CreatedAt字段如何?有時單獨的排序順序表(ListItemSortOrder)很有用。

2

我看到三個選擇:

  • 排序字段列表中的項目表。通常最好的選擇:簡單,做你需要的。如果它是你想要的,可以自動填充一個時間戳。

  • 包含排序信息的單獨表格。如果有任意數量的訂單需要維護,則很有用

  • 下一個/上一列:這是大多數情況下的惡夢,但實際上可能是有用的,如果您有大量列表項並需要插入中間很多。

1

如果你的表的特定於域的意思是真正的通用的「列表」和「列表項」,那麼你可以做的最好的是提供一個通用的「排序」一欄。

但是,如果您的表格在業務領域具有更具體的含義,那麼您希望排序順序列在該域中​​具有更多含義。一個例子是訂單和LineItem的表,其中排序列將LineItemNumber:

CREATE TABLE [Orders](
    [ID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY 
) 
GO 

CREATE TABLE [LineItems](
    [ID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [OrderID] [int] NOT NULL, 
    [LineItemNumber] [int] NOT NULL, 
CONSTRAINT [UC_LineItems] UNIQUE NONCLUSTERED 
(
    [OrderID] ASC, 
    [LineItemNumber] ASC 
) 
) 
GO 

ALTER TABLE [LineItems] WITH CHECK ADD CONSTRAINT [FK_LineItems_Orders] 
    FOREIGN KEY([OrderID]) 
REFERENCES [Orders] ([ID]) 
GO 
ALTER TABLE [LineItems] CHECK CONSTRAINT [FK_LineItems_Orders] 
GO 

注意,我添加了一個給定的順序不能有相同的LineItemNumber兩個行項目的特定於域的約束。在列表/列表項的情況下,這個約束是不必要的。