2009-07-05 8 views
1

J'ai une base de données contenant deux tables; List et ListItem. Ces tables ont une relation un-à-plusieurs. Mais une exigence est de permettre le tri des ListItems liés à une liste donnée. En plus d'avoir un champ "ordre de tri" dans la table ListItem, quelle serait une bonne approche?Schéma de base de données: Gestion de l'ordre des articles

+0

Cela n'a rien à voir avec asp.net-mvc –

Répondre

0

Si vous êtes invité à fournir une méthode autre qu'un champ Trier ou Séquence, que pensez-vous d'un champ CreatedAt? Parfois, une table d'ordre de tri distincte (ListItemSortOrder) est utile.

2

Je vois trois alternatives:

  • champ de tri de commande dans la table d'élément de liste. Normalement, le meilleur choix: Simple et fait ce dont vous avez besoin. Si c'est ce que vous voulez, cela pourrait être automatiquement rempli avec un horodatage.

  • une table distincte contenant les informations de tri. Utile s'il y a un nombre arbitraire de commandes à maintenir

  • une colonne suivante/précédente: Ceci est un cauchemar dans la plupart des scénarios, mais pourrait en fait être utile, si vous avez d'énormes quantités d'éléments de liste et devez insérer dans le milieu beaucoup.

1

Si le sens spécifique au domaine de vos tables est vraiment aussi générique que « Liste » et « Liste Item », le mieux que vous pouvez faire est de fournir une colonne générique « Ordre de tri ». Toutefois, si vos tables ont une signification plus spécifique dans le domaine métier, vous souhaiterez que la colonne Ordre de tri ait plus de sens dans ce domaine. Un exemple serait des ordonnances et des tables LineItem, où la colonne de tri serait 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 

Notez que j'ai ajouté la contrainte spécifique au domaine qu'un ordre donné ne peut pas avoir deux postes avec le même LineItemNumber. Cette contrainte n'est pas nécessaire dans tous les cas de List/ListItem.

Questions connexes