Database design DB模式:维护项目顺序

Database design DB模式:维护项目顺序,database-design,Database Design,我有一个包含两个表的数据库;列表和列表项。这些表具有一对多关系。但要求是允许对与给定列表相关的列表项进行排序。除了在ListItem表中有一个“排序顺序”字段外,还有什么好方法呢?如果要求您提供排序或序列字段以外的其他方法,那么CreatedAt字段如何?有时单独的排序顺序表(ListItemSortOrder)很有用。我看到三种选择: 列表项表中的排序顺序字段。通常情况下,最好的选择是:简单,做你需要的。如果这是您想要的,则可以自动用时间戳填充 包含排序信息的单独表。如果要维护任意数量的订单

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

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

我看到三种选择:

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

  • 包含排序信息的单独表。如果要维护任意数量的订单,则此选项非常有用

  • <>NeX/PRV栏目:在大多数情况下,这是一个噩梦,但实际上,如果你有大量的列表项,需要在中间插入很多,实际上是有用的。


如果表的特定于域的含义确实与“列表”和“列表项”一样通用,那么您最好提供一个通用的“排序顺序”列

但是,如果您的表在业务域中有更具体的含义,您将希望排序顺序列在该域中有更多的含义。例如Orders和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的行项目。在列表/列表项的任何情况下都不需要该约束。

这与asp.net-mvc无关