Je suis très nouveau dans le domaine des bases de données, donc cela peut sembler ignorant, mais je suis curieux de savoir pourquoi une clé doit être explicite dans une table. Est-ce principalement pour dire à l'utilisateur que la valeur de colonne donnée est (espérons-le) garantie d'être unique dans chaque ligne? L'unicité devrait toujours être là même si elle n'est pas mentionnée.
primary-key
unique-constraint
dsaxton
la source
la source
Réponses:
Vous suggérez évidemment que les
CONSTRAINT
s dans une base de données devraient être appliqués par les applications qui accèdent à cette base de données?Il y a plusieurs raisons pour lesquelles c'est une mauvaise (mauvaise, mauvaise ...) idée.
1) Si vous construisez un moteur de contrainte "roll-your-own" (c'est-à-dire dans votre code d'application), vous émulez simplement ce qu'Oracle / SQL Server / MySQL / PostgreSQL / <. Quiconque ...> a dépensé années d' écriture. Leur code CONSTRAINT a été testé au cours de ces années par des millions d'utilisateurs finaux.
2) Avec tout le respect que je vous dois ainsi qu'à votre équipe, vous n'allez pas faire les choses correctement, même dans quelques années - à partir d' ici , le code MySQL coûte à lui seul 40 millions de dollars. Et MySQL est le moins cher des 3 serveurs ci-dessus, et ils n'implémentent même pas CHECK CONSTRAINTs. De toute évidence, obtenir RI (Referential Integrity) complètement à droite est difficile.
J'avais l'habitude de fréquenter les forums Oracle et je ne peux pas vous dire le nombre de fois où un pauvre gestionnaire / programmeur s'est vu imposer un projet où le génie qui avait son travail avant a eu l'idée "brillante" de faire ce que vous suggérez .
Jonathan Lewis (il a écrit un livre de 550 pages sur les principes fondamentaux de l' optimiseur Oracle ) donne non. 2 de ses désastres de conception dans un autre livre (" Tales of the Oak Table " - la Oak Table est un groupe d'experts Oracle) est
3) Même si, par miracle, vous pouvez correctement implémenter RI, vous devrez le réimplémenter complètement maintes et maintes fois pour chaque application qui touche cette base de données - et si vos données sont importantes, alors de nouvelles applications le feront. Choisir cela comme paradigme vous mènera, vous et vos collègues programmeurs (sans parler du personnel de soutien et des ventes), à une vie de lutte contre les incendies et de misère.
Vous pouvez en savoir plus sur la raison pour laquelle la mise en œuvre de CONTRAINTES de données au niveau de l'application n'est rien de moins que de la folie ici , ici et ici .
Pour répondre spécifiquement à votre question:
La raison pour laquelle
KEY
s (soitPRIMARY
,FOREIGN
,UNIQUE
ou tout simplement ordinairesINDEX
es) sont déclarées est que, alors qu'il est pas strictement nécessaire à une base de données pour les avoir pour elle fonctionne, il est absolument nécessaire qu'ils soient déclarés pour qu'il fonctionne bien .la source
Lorsque vous créez une clé dans une base de données, le moteur de SGBD applique une contrainte d'unicité sur les attributs de clé. Cela sert au moins trois objectifs connexes:
la source
J'ajouterai un aspect aux excellentes réponses existantes: la documentation. Il est souvent important de voir quels types de clés vous pouvez utiliser pour identifier une entité. Toute combinaison de colonnes uniques est une clé candidate.
La clé primaire tend à être un concept particulièrement utile dans la pratique.
Que vous appliquiez une clé ou non (vous devriez probablement le faire), la documentation est précieuse en soi.
la source
FOREIGN KEY
définitions pour obtenir un sentir pour le système ". Ma requête a renvoyé zip !!! Sûr que mon SQL devait être faux, j'en ai parlé à l'un des programmeurs seniors. Avec fierté (pas moins), il a annoncé (comme s'il présentait un fils nouveau-né) que le système n'avait pas de FK parce que "toutes les recherches sont surPRIMARY KEY
s" - (non pertinent). <Doh ...> à la Homer Simpson!Une autre raison pour laquelle vous devriez utiliser des CONTRAINTES au lieu d'un code interne à l'application:
Que se passe-t-il si un développeur / dba utilise une instruction insert / update / delete pour modifier les données directement dans la base de données? Dans ce cas, toute votre intégrité référentielle basée sur une belle application sera inutile. Je sais, certains développeurs aiment la possibilité de modifier directement les données sans avoir à se soucier de RI car ils savent ce qu'ils font - au moins la plupart du temps (mais pas toujours)
PS: Bien sûr, vous pouvez créer des déclencheurs, mais ils sont généralement terriblement lents (par rapport aux CONTRAINTES).
la source