2009-08-11 6 views
1

J'ai une base de données pour la modélisation d'une entreprise de location. La base de données stocke des informations pour plusieurs fournisseurs (propriétaires) et chaque fournisseur a un sous-ensemble de dépôts. Chaque dépôt est fermé certains jours de l'année, certains sont spécifiques à ce dépôt (peuvent être fermés tous les samedis ou toute une semaine à l'Action de grâces) et d'autres sont globaux (tous les dépôts sont fermés à Noël.) J'essaie de trouver le meilleur moyen de modéliser cetteComment puis-je modéliser ceci dans une base de données relationnelle?

Ma première pensée était d'avoir une table DepotClosed comme suit:.

depotclosed 
    id (PK) INT 
    start_date DATE 
    end_date DATE 
    display VARCHAR 
    global BOOLEAN 
    depot_id (FK) 

Mon problème avec ceci est que quand il est un jour férié global du depot_id sera nulle, mais ce n'est pas « non défini », la fête est juste pour tous les dépôts Peut-être que je fais juste plus d'une affaire à partir de ce que je devrais faire.Toutes les pensées seraient les bienvenues

Merci

Répondre

1

Je pense que cette structure est correcte. Vous pouvez simplement sélectionner toutes les lignes où global est vrai. Cela se traduirait par deux requêtes pour trouver les dates de fermeture pour un seul magasin, une pour toutes les dates fermées pour un seul magasin, et une pour toutes les dates fermées globales. Vous avez eu la bonne idée d'éviter de mettre des entrées de dates globales pour chaque magasin: si quelque chose devait changer cela serait pénible.

+1

Merci Vince, je suppose que vous pourriez aussi le faire en une seule requête. Sélectionnez * De dépôt INNER JOIN depot fermé ON (depot.id = depotclosed.depot_id OU depotclosed.global = TRUE) – Shane

1

Ma préférence serait d'enregistrer explicitement une fermeture pour chaque dépôt (c'est-à-dire d'ajouter une ligne à cette table depotclosed pour chaque dépôt). De cette façon, il n'y a pas d'ambiguïté, et vous pouvez effectuer JOIN s ordinaires contre la table. Alternativement, vous pouvez simplement laisser depot_id vide (c'est-à-dire NULL) et ainsi imposer la compréhension que lorsque aucun dépôt n'est listé, il s'applique à tous les dépôts. De cette façon, cependant, vous devriez écrire JOIN de la quelque chose comme ceci:

SELECT things 
FROM depot 
INNER JOIN depotclosed ON (depotclosed.depot_id = depot.depot_id OR depotclosed.depot_id IS NULL) 
+1

Les implications de l'intégrité des données me font peur avec cette solution. Par exemple, si un nouveau dépôt est ajouté, nous devons nous souvenir d'ajouter une ligne à ce dépôt pour chaque jour férié global. – JoshJordan

0

je trouverais que pour être une solution acceptable. Assurez-vous simplement que votre logique d'application vérifie toujours le global booléen avant de vérifier le depot_id. En outre, assurez-vous que vous n'avez pas une contrainte qui nécessite une valeur pour depot_id en tant que FK. L'alternative, comme je le vois, est de créer une table pour les vacances globales et cette table pour les vacances locales, moins le global booléen. Cela nécessite le même type de vérifications dans l'application, de sorte que l'une ou l'autre serait acceptable pour moi.

0

Combien de dépôts prévoyez-vous au total? Si la réponse est quelque chose comme 100, vous pourriez envisager d'entrer une ligne dans le tableau pour chaque dépôt dans le cas d'un jour férié. Cela gaspille de l'espace, mais cela pourrait en fait gagner du temps.

Les requêtes que vous aurez à faire pour un deopt donné seront très simples, car vous n'aurez pas besoin de logique supplémentaire pour tester les entrées globales.

+0

probablement juste à côté de 100 dépôts serait le plus – Shane

Questions connexes