DB Schema:维护项目订单

时间:2009-07-05 13:29:13

标签: database-design

我有一个包含两个表的数据库; List和ListItem。这些表具有一对多的关系。但要求是允许对与给定List相关的ListItem进行排序。除了在ListItem表中有一个“排序顺序”字段,对此有什么好处?

3 个答案:

答案 0 :(得分:2)

我看到三种选择:

  • 列表项表中的排序顺序字段。通常最好的选择:简单,做你需要的。如果它是您想要的,可以自动填充时间戳。

  • 包含排序信息的单独表格。如果要保留任意数量的订单,则非常有用

  • 下一个/上一栏:在大多数情况下,这是一场噩梦,但如果您有大量的列表项并且需要在中间插入很多,那么它实际上可能很有用。

答案 1 :(得分:1)

如果您的表的特定于域的含义与“列表”和“列表项”一样通用,那么您可以做的最好的事情就是提供通用的“排序顺序”列。

但是,如果您的表在业务域中具有更具体的含义,您将希望排序顺序列在该域中​​具有更多含义。一个例子是Orders和LineItem表,其中sort列是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的订单项。在List / ListItem的evey情况下,该约束不是必需的。

答案 2 :(得分:0)

如果要求您提供排序或序列字段以外的方法,那么CreatedAt字段如何?有时,单独的排序顺序表(ListItemSortOrder)很有用。