Table SQL reliant... est-il préférable d'avoir une table de liaison, ou délimité de la colonne?

Ma base de données a deux tables, l'une contient une liste d'utilisateurs, de l'autre une liste de rôles. Chaque utilisateur appartient à un ou plusieurs rôles, et bien sûr, chaque rôle aura de multiples utilisateurs.

Je suis venu à travers deux façons de lier l'information. La première est d'ajouter une troisième table qui contient les ID des deux tables. Une simple jointure sera ensuite de retour à tous les utilisateurs qui appartiennent à un rôle, ou tous les rôles auxquels appartient un utilisateur. Cependant, comme la base de données augmente, les ensembles de données renvoyées par ces requêtes simples va croître de façon exponentielle.

La deuxième méthode est d'ajouter une colonne à la table des utilisateurs, dans lequel une liste délimitée par des virgules de rôles est stocké. Cela permettra d'éliminer la nécessité pour la troisième table de liaison, ce qui peut avoir un effet positif sur la croissance de base de données. L'inconvénient est que SQL n'a pas la capacité d'utiliser des listes délimitées. Le seul moyen que j'ai trouvé pour traiter de l'information, est d'utiliser une table temporaire et une fonction personnalisée.

Est la visualisation de mes plans d'exécution, le "tableau d'analyse de l'événement" est celui qui prend le plus de ressources. Il est logique que l'élimination d'un tableau à partir de l'équation serait d'accélérer les choses. La fonction prend moins de 1% des ressources.

Ces tests ont été réalisés sur une base de données avec moins de 20 dossiers. Comme la taille de la base de données augmente, les analyses de la table prendra plus de temps, donc peut-être de limiter eux est le meilleur choix.

Si à l'aide de la liste délimitée par des virgules est une bonne façon d'aller, pourquoi personne ne le fait?

Merci de me dire quel est votre méthode préférée (même si c'est différent de mes deux), et pourquoi.

Merci.

Ne jamais tester sur une petite quantité de données si vous vous attendez à une grande quantité pour être stocké. Les requêtes qui fonctionnent très bien sur des petites quantités de données sont souvent des chiens sur de grands ensembles de données. La reson youo obtenu l'analyse de la table est probablement que vous n'avez eu que 20 dossiers, bases de données n'ont pas tendance à utiliser les index, même si elles existent pour une table de petit.
Vous dites: "Toutefois, comme la base de données augmente, les ensembles de données renvoyées par ces requêtes simples va croître de façon exponentielle." Je ne peux pas imaginer comment cela pourrait être vrai, même si vous avez eu autant de rôles utilisateurs. Une requête de rôles à un utilisateur appartient à est limitée par le nombre d'utilisateurs, et inversement pour les utilisateurs ayant un rôle. Un produit croisé requête serait votre jeu de données au carré: un polynôme augmentation, pas une exponentielle.

OriginalL'auteur RichieACC | 2010-01-21