un tableau d'articles qui contiendra (potentiellement) des dizaines de millions d'enregistrements.
Ce n'est en fait pas tant que ça, étant donné ce que SQL Server peut gérer efficacement. Bien sûr, je me souviens d'un de mes emplois précédents où l'une des plus grandes tables (un système à instance unique) avait 2 millions de lignes et c'était le plus que j'avais jamais traité. Ensuite, le travail suivant avait 17 instances de production avec certaines tables ayant des centaines de millions de lignes, et qui ont toutes été regroupées dans un entrepôt de données avec plusieurs tables de faits ayant plus d'un milliard de lignes. Ne vous méprenez pas, je ne me moque pas de dizaines de millions de lignes, je souligne simplement qu'avec un bon modèle de données et une indexation (et une maintenance d'index) appropriées, SQL Server peut gérer beaucoup .
Jusqu'à 50% des articles peuvent être «non approuvés» à tout moment.
Hmm. Cela ne semble pas juste. Le taux «d'approbation» des entrées sera la moitié du taux d'obtention de nouvelles entrées? Pour chaque 2 nouvelles entrées, une seule sera "approuvée"? Dans votre exemple de 2 millions de lignes, et 1 million chacune pour "approuvé" et "non approuvé", quelques années plus tard avec encore 10 millions d'entrées, vous vous attendez à 6 millions chacune pour "approuvé" et "non approuvé"? Ou est-ce que le 1 million "non approuvé" restera quelque peu constant, de sorte qu'avec 10 millions de nouvelles entrées, il y aura 11 millions "approuvé" et toujours 1 million "non approuvé"?
Les enregistrements peuvent devenir "approuvés", mais pas l'inverse.
C'est vrai aujourd'hui , mais les choses changent avec le temps et il y a donc toujours la possibilité que l'entreprise décide d'autoriser "non approuvé", ou peut-être un autre statut, comme "archivé", etc.
Alors, regardons les choix:
Drapeau (ou peut-être même TINYINT
"statut")
- Légèrement plus lent pour les requêtes de chaque statut
- Plus flexible dans le temps / facile à incorporer un changement tel qu'un troisième état (par exemple "Archivé") avec seulement une nouvelle valeur de statut de recherche. Pas de nouvelle table (nécessairement), du nouveau code, seulement du code mis à jour.
- Moins de travail (c.-à-d. Code, tests, etc.) et moins de place pour l'erreur de mise à jour d'une seule
TINYINT
colonne
- Moins compliqué = coûts de maintenance réduits au fil du temps, temps de formation plus court pour les nouveaux employés à comprendre
- (éventuellement) Impact plus faible sur le journal des transactions car une table est mise à jour
- Juste besoin d'une table de recherche pour "RecordStatus" et FK entre les deux tables.
Deux tableaux distincts (un pour «approuvé», un pour «non approuvé»)
- Légèrement plus rapide pour les requêtes de chaque statut
- Moins flexible dans le temps / plus difficile à incorporer un changement tel qu'un troisième état (par exemple "Archivé"); un nouvel état nécessiterait très probablement une autre table, et certainement un code nouveau et mis à jour.
- Plus de travail (c.-à-d. Code, tests, etc.) et plus d'espace pour les erreurs de déplacement des enregistrements de la table "Non approuvé" vers la table "Approuvé"
- Plus compliqué = coûts de maintenance plus élevés au fil du temps, temps de formation plus long pour les nouveaux employés à comprendre
- (éventuellement) Plus grand impact sur le journal des transactions car une table est supprimée et une est insérée
- Pas besoin de vous soucier du " renouvellement de l'ID de l'article ": la table non approuvée a une colonne ID qui est une
IDENTITY
colonne, et la table approuvée a une colonne ID qui n'est pas une IDENTITY
(car elle n'est pas nécessaire à cet endroit). Par conséquent, les valeurs d'ID restent cohérentes lorsque l'enregistrement se déplace entre les tables.
Personnellement, je me pencherais vers la table unique avec StatusID
colonne pour commencer. L'utilisation de deux tables semble être une optimisation trop compliquée et prématurée. Ce type d'optimisation peut être discuté si / lorsque le nombre d'enregistrements est de plusieurs centaines de millions et que l' indexation n'apporte aucun gain de performances.