La base de données, des tables et des Colonnes des Conventions de Nommage?
Chaque fois que je crée une base de données, je me demande toujours si il y a une meilleure façon de nommer un élément dans ma base de données. Très souvent, je me pose les questions suivantes:
- Devrait table des noms au pluriel?
- Devrait noms de colonne de l'être singulier?
- Dois-je le préfixe des tables ou des colonnes?
- Dois-je utiliser tout cas dans le nommage des articles?
Existe-il des lignes directrices recommandées pour le nommage des éléments dans une base de données?
- Je pense que nous devrions nom pluriel pour les Tables et singulier pour les colonnes.
- Je vois un tableau "stockage" avec plusieurs éléments, pas une seule "entité" donc j'ai le nom de ce pluriel. Quand j'ai mappé les tables dans les objets, je voudrais nommer les objets singuliers. Ce n'est que mon opinion personnelle.
- À l'aide de l'ID de tous les coins de la place est en ENFER pour quiconque de faire des jointures de tables multiples. Il n'est pas possible que le léger avantage de le savoir c'est le PK l'emporte sur l'incroyable ennui de re-aliasing l'dang colonne ID dans chaque sanglante requête maintes et maintes fois. Si vous voulez une manière de désigner le PK dans une table, de faire la première colonne. Aussi, dénotant FKs dans les noms de colonnes est dans mon esprit une autre solidement mal anti-modèle.
- Jetez un oeil à cette Réponse.
Vous devez vous connecter pour publier un commentaire.
Je recommande de vérifier le Serveur SQL de Microsoft exemples de bases de données:
https://github.com/Microsoft/sql-server-samples/releases/tag/adventureworks
AdventureWorks exemple utilise une très claire et cohérente de la convention d'affectation de noms qui utilise des noms de schéma pour l'organisation des objets de base de données.
production_BillOfMatterials
. J'ai édité urini réponse de clarification (et pour que je puisse annuler mon bas de vote.) C'est en fait un non-trivial d'efforts pour trouver le AdventureWorks les noms de table si on n'est pas sur Windows!ID
deschema name
.table name
) pour la seule raison qu'elle permet de nom de chosesize
ouwith
etc. Et comme on ne sait jamais ce qui devient un des mots réservés dans l'avenir,ne pas le faire pourrait briser votre conception impressionnante.Retard de réponse ici, mais en bref:
Élaboration:
(1) Ce que vous devez faire. Il y a très peu de choses que vous doit faire d'une certaine façon, à chaque fois, mais il y a quelques.
(2) Ce que vous devriez faire.
(3) Ce que vous devriez considérer.
préfixe colonnes.
Customer.ID
est plus compliqué queCustomerID
, en fait c'est même plus clair, puisque vous savez que c'est la clé primaire deCustomer
.Customer.CustomerID
est également redondante.CustomerID
est le PK deCustomer
? Pourquoi voudriez-vous utiliser le nom complet des alias au lieu dec
pourCustomer
? Pourquoi voudriez-vous pour éviter le "dédoublement" dec.CustomerID
seulement de gagner de la duplication deSELECT CustomerID = Customer.ID, UserID = User.ID, ShippingID = Shipping.ID
!?!?!?! C'est de la folie, pour moi, quand vous pourriezSELECT c.CustomerID, c.UserID, c.ShippingID
.CustomerID
est la clé primaire de laCustomer
table, ou une clé étrangère dans certains autres de la table. C'est un problème mineur. Pourquoi voudriez-vous d'utiliser pauvres des noms commec
?CustomerID = Customer.ID
est très clair que vous voyez que vous vous joignez à une clé étrangère avec une clé primaire; il n'est pas redondant que les deux côtés sont deux choses différentes. Caractère unique de nommage est une mauvaise pratique de l'OMI.tblTable
,tlkLookupTable
, ettinIntersectTable
table de nommage, etkeyTableId
,frnkeyTableId
colonne de nommage. Que "traiteur pour les nouveaux arrivants", mais c'était débile.It should be legal to beat up someone who does not do this.
- il vient de faire ma journée, lol.customers_id
au lieu decustomers.id
. Il fait le nom de la colonne unique sur tous les tableaux, ce qui n'est pas seulement bon pour la compréhension, mais vous permet également d'utiliserUSING(customers_id)
pourJOIN
s, de les rendre plus concis.Ltn_id
est plus simple de sort queLongTableName.Id
Ok, depuis que nous sommes pesant avec l'opinion:
Je crois que les noms de table devrait être au pluriel. Les Tables sont une collection (un tableau) des entités. Chaque ligne représente une entité unique, et le tableau représente la collection. Je voudrais donc appeler un tableau de Personne entités des Personnes (ou des Personnes, celui qui prend votre fantaisie).
Pour ceux qui aiment voir singulier "noms d'entité" dans les requêtes, c'est ce que je voudrais utiliser des alias de table pour:
Un peu comme LINQ "de la personne dans les gens de choisir personne.Nom".
Que pour 2, 3 et 4, je suis d'accord avec @Lars.
Person
.Name
dePerson
" ne sera pas, pour l'ordinaire, sélectionnez un nom unique. Il permet de sélectionner tous les noms de toutes les personnes. Nous parlons de paradigme de programmation versus paradigme relationnel ici.Je travail dans une base de données de l'équipe de soutien avec trois Administrateurs de base de données et nos options envisagées sont les suivantes:
Nous utilisons le singulier des noms pour les tables. Les Tables ont tendance à être préfixé par le nom du système (ou de son acronyme anglais). Ceci est utile si le système complexe que vous le pouvez modifier le préfixe de groupe des tables logiquement (c'est à dire. reg_customer, reg_booking et regadmin_limits).
Pour les champs nous nous attendons à des noms de champs à inclure le préfixe/acryonm de la table (c'est à dire cust_address1) et nous préférons également l'utilisation d'un ensemble de suffixes ( _id pour le PK, _cd pour "code", _nm pour "nom", _nb de "nombre", _dt "Date").
Le nom de la Foriegn champ de la clé devrait être le même que le champ de clé Primaire.
c'est à dire
Lors de l'élaboration d'un nouveau projet, je vous recommande d'écrire toutes les préférés des noms d'entité, les préfixes et les acronymes et donner ce document à votre développeurs. Puis, quand ils décident de créer une nouvelle table, ils peuvent consulter le document plutôt que de "deviner" ce que la table et les champs devraient être appelés.
Personne, non pas les personnes, c'est comment vous référer à quiconque de l'un des enregistrements représente.
Ok. C'est mon $0.02
Je suis également en faveur d'une norme ISO/IEC 11179 style naming convention, notant qu'ils sont des lignes directrices plutôt que normative.
Voir Élément de données nom sur Wikipédia:
"Les tableaux sont des Collections d'Entités, et de suivre la Collecte de l'intitulé. Idéalement, un nom collectif qui est utilisé: par exemple, Personnel. Le pluriel est aussi correct: les Employés. Incorrect, les noms suivants: Employé, tblEmployee, et table employeetable."
Comme toujours, il y a des exceptions à des règles par exemple, un tableau qui a toujours exactement une ligne peut être mieux avec un nom singulier par exemple, une table de configuration. Et la cohérence est de la plus haute importance: vérifier si le magasin a une convention et, si oui, suivez-le; si vous ne l'aimez pas, puis de faire une analyse de rentabilisation pour l'avoir changé, plutôt que d'être le lone ranger.
notre préférence:
Devrait table des noms au pluriel?
Jamais. Les arguments pour une collection de faire sens, mais vous ne savez jamais ce que le tableau va contenir (0,1 ou plusieurs éléments). Pluriel les règles de l'appellation inutilement compliqué. 1 Maison, 2 maisons, la souris vs souris, personne vs les gens, et nous n'avons même pas regardé les autres langues.
Update person set property = 'value'
agit sur chaque personne dans le tableau.Select * from person where person.name = 'Greg'
renvoie une collection/ensemble de lignes de la personne de lignes.Devrait noms de colonne de l'être singulier?
Normalement, oui, sauf si vous êtes en rupture de normalisation des règles.
Dois-je le préfixe des tables ou des colonnes?
Surtout une plate-forme de préférence. Nous préférons préfixe colonnes avec le nom de la table. Nous n'avons pas le préfixe des tables, mais nous ne le préfixe de vues (v_) et stored_procedures (sp_ ou f_ (fonction)). Qui aide les gens qui veulent essayer de upday v_person.l'âge qui est en fait un champ calculé dans une vue (qui ne peut pas être mis à Jour de toute façon).
C'est aussi un excellent moyen d'éviter les mots clés de collision (la livraison.après les pauses, mais delivery_from ne fonctionne pas).
Il ne rendre le code plus détaillé, mais souvent des aides en lisibilité.
bob = new person()
bob.person_name = 'Bob'
bob.person_dob = '1958-12-21'
... est très lisible et explicite. Ce peut sortir de la main si:
customer.customer_customer_type_id
indique une relation entre le client et le client_type tableau, indique la clé primaire sur le client_type table (customer_type_id) et si jamais vous voir "customer_customer_type_id", alors que le débogage d'une requête, vous savez instantanément où c'est à partir de (table client).
ou si vous avez un M-M la relation entre client_type et customer_category (seuls certains types sont disponibles pour certaines catégories)
customer_category_customer_type_id
... c'est un peu (!) sur le côté long.
Dois-je utiliser tout cas dans le nommage des articles?
Oui - en bas de casse :), avec des traits de soulignement. Ceux-ci sont très lisibles et multi-plateforme. Avec 3 ci-dessus, il est aussi judicieux.
La plupart de ces sont toutefois des préférences. - Tant que vous êtes cohérent, il doit être prévisible pour quelqu'un qui a le lire.
SELECT * FROM people AS person WHERE person.name = 'Greg'
sonne plus naturel pour moi.<table name><id>
, par exemplePersonID
ouPerson_ID
etc. Par conséquent, il est plus judicieux de ne PAS le nom de vos tables au pluriel comme chaque enregistrement est une personne distincte, et non les personnes.J'entends l'argument, tout le temps que si une table est la marque du pluriel est une question de goût personnel et il n'y a pas de meilleure pratique. Je ne crois pas que c'est vrai, surtout en tant que programmeur, par opposition à un DBA. Autant que je sache, il n'y a pas de raisons légitimes pour mettre le pluriel d'un nom de table autres que "C'est tout simplement logique pour moi parce que c'est une collection d'objets," alors qu'il est légitime de gains dans le code en ayant singulier les noms de table. Par exemple:
Il évite les bugs et les erreurs causées par le pluriel des ambiguïtés. Les programmeurs ne sont pas exactement connus pour leur orthographe expertise, et pluralisant certains mots sont source de confusion. Par exemple, le pluriel fin de mot dans 'es' ou tout simplement 's'? Est-il des personnes ou des personnes? Lorsque vous travaillez sur un projet avec de grandes équipes, cela peut devenir un problème. Par exemple, un cas où un membre de l'équipe utilise la méthode incorrecte de pluraliser une table qu'il crée. Par le temps que j'ai interagir avec ce tableau, il est utilisé partout dans le code, je n'ai pas accès ou serait trop long à corriger. Le résultat est que j'ai à vous rappeler de le sort de la table de mal à chaque fois que je l'utilise. Quelque chose de très similaire à ce qui s'est passé pour moi. Le plus facile, vous pouvez le faire pour chaque membre de l'équipe de manière cohérente et facilement l'utilisation exacte de la, de corriger les noms de table sans erreurs ou d'avoir à rechercher les noms de table de tous les temps, le meilleur. Le singulier version est beaucoup plus facile à manipuler dans un environnement d'équipe.
Si vous utilisez le singulier version d'un nom de table ET le préfixe de la clé primaire avec le nom de la table, vous avez maintenant l'avantage de facilement déterminer un nom de table à partir d'une clé primaire ou vice versa via le code seul. Vous pouvez être donné une variable avec un nom de table en elle, concaténer "Id" à la fin, et vous avez maintenant la clé primaire de la table via le code, sans avoir à faire une requête supplémentaire. Ou vous pouvez couper "Id" de la fin d'une clé primaire pour déterminer un nom de table via le code. Si vous utilisez "id" sans un nom de table pour la clé primaire, alors vous ne pouvez pas via le code de déterminer le nom de la table à partir de la clé primaire. En outre, la plupart des gens qui au pluriel les noms de table et un préfixe PK colonnes avec le nom de la table de l'utilisation du singulier version du nom de la table dans le PK (par exemple les statuts et les status_id), il est impossible de faire tout cela.
Si vous faites de la table des noms au singulier, vous pouvez les faire correspondre à la classe des noms qu'ils représentent. Encore une fois, cela peut simplifier le code et vous permet de faire vraiment des choses intéressantes, comme l'instanciation d'une classe en ayant rien, mais le nom de la table. Il est également à seulement rend votre code plus homogène, ce qui conduit à...
Si vous faites le nom de la table singulier, il rend votre schéma de nommage cohérent, organisé et facile à maintenir dans chaque emplacement. Vous savez que dans tous les cas, dans votre code, qu'il s'agisse d'un nom de colonne, comme un nom de classe, ou comme le nom de la table, c'est exactement le même nom. Cela vous permet de faire des recherches globales de voir partout que les données sont utilisées. Lorsque vous mettre le pluriel d'un nom de table, il y aura des cas où vous allez utiliser le singulier version de la table (nom de la classe à laquelle il se transforme en, dans la clé primaire). Il est tout à fait logique de ne pas avoir certains cas où vos données est considéré comme du pluriel et certains cas singulier.
Pour résumer, si vous pluraliser vos noms de table vous sont en train de perdre toutes sortes d'avantages à rendre votre code plus intelligent et plus facile à manipuler. Il peut même y avoir des cas où vous devez avoir des tables/tableaux de convertir vos noms de table pour objet ou locale des noms de code, vous pourriez avoir à éviter. Singulier les noms de table, mais peut-être se sentir un peu bizarre au premier abord, offrent des avantages significatifs par rapport à la marque du pluriel des noms et des je crois de bonnes pratiques.
Prendre un coup d'oeil à la norme ISO 11179-5: dénomination et d'identification des principes
Vous pouvez l'obtenir ici: http://metadata-standards.org/11179/#11179-5
J'ai blogué à ce sujet un certain temps de retour ici: ISO 11179 Conventions de Nommage
Je sais que c'est la fin du jeu, et la question a été répondue déjà très bien, mais je veux vous donner mon avis sur no 3 au sujet de l'ajout de préfixe des noms de colonne.
Toutes les colonnes doivent être nommés avec un préfixe qui est unique à la table qu'ils sont définis dans.
E. g. Compte tenu de tables "client" et "adresse", allons-y avec les préfixes de "cust" et "addr", respectivement. "client" aurait "cust_id", "cust_name", etc. en elle. "adresse" aurait "addr_id", "addr_cust_id" (FK retour à la clientèle), "addr_street", etc. en elle.
Lorsque j'ai été présenté avec cette norme, j'étais mort de set contre lui; je détestais l'idée. Je ne pouvais pas supporter l'idée de tout ce que supplémentaires de dactylographie et de la redondance. Maintenant j'en ai assez d'expérience avec elle que je n'avais jamais revenir.
Le résultat est que toutes les colonnes dans votre schéma de base de données sont uniques. Il est l'un des avantages majeurs de cette, qui l'emporte sur tous les arguments contre (à mon avis, bien sûr):
Vous pouvez rechercher l'ensemble de votre base de code et de manière fiable trouver chaque ligne de code qui touche une colonne particulière.
L'avantage de la #1 est incroyablement vaste. Je peux rendre caduque une colonne et de savoir exactement quels fichiers doivent être mis à jour avant de la colonne peuvent être retirés à partir du schéma. Je peut changer le sens d'une colonne et de savoir exactement ce que le code doit être remaniée. Ou je peux simplement vous dire si les données d'une colonne est même utilisé dans une partie donnée du système. Je ne peux pas compter le nombre de fois cela s'est avéré d'un risque d'être énorme projet dans un simple, ni le nombre d'heures que nous avons enregistré dans les travaux de développement.
Autre, relativement léger avantage, c'est que vous n'avez qu'à utiliser la table des alias lorsque vous effectuez une auto-jointure:
reliably find every line of code that touches a particular column
... N'est-ce pas le but?Mon avis sur ces sont:
1) Non, les noms de table doivent être au singulier.
Alors qu'il semble faire sens pour la simple sélection (
select * from Orders
) il fait moins de sens pour les OO équivalent (Orders x = new Orders
).Une table dans une base de données est vraiment l'ensemble de l'entité, il fait plus de sens une fois que vous êtes à l'aide de jeu-la logique:
Que la dernière ligne, la logique réelle de la jointure, semble prête à confusion avec le pluriel des noms de table.
Je ne suis pas sûr de toujours utiliser un alias (comme Matt l'indique) efface jusqu'.
2) Ils doivent être au singulier, car ils ne détiennent que 1 biens
3) ne Jamais, si le nom de colonne est ambiguë (comme ci-dessus, où ils ont tous deux une colonne appelée [Key]) le nom de la table (ou son alias) peut les distinguer assez bien. Vous souhaitez que les requêtes soient rapides de type simple et préfixes ajouter une complexité inutile.
4) tout ce que vous voulez, je vous suggère de CapitalCase
Je ne pense pas qu'il y a un ensemble de lignes directrices absolus sur l'un de ces.
Aussi longtemps que ce que vous choisissez est cohérent dans l'application ou DB je ne pense pas que cela compte vraiment.
CapitalCase
?pascal case
Product.ProductName
,Product.ProductID
,Product.ProductPrice
etc tapantProduct.P
vous donne tous les préfixé champs.À mon avis:
Cependant, comme il a été mentionné, toute convention est mieux que pas de convention. Peu importe comment vous choisissez de le faire, le document de sorte que les futures modifications suivent les mêmes conventions.
Je pense que la meilleure réponse à chacune de ces questions sera donnée à vous et à votre équipe. Il est beaucoup plus important d'avoir une convention de nommage alors, comment exactement la convention de nommage est.
Comme il n'y a pas de bonne réponse à cette question, vous devez prendre un certain temps (mais pas trop) et de choisir vos propres conventions et - voici important - s'en tenir à elle.
Bien sûr, il est bon de chercher quelques informations sur les normes, sur qui, qui est-ce que vous demandez, mais ne soyez pas anxieux ou inquiet de voir le nombre de réponses différentes que vous pourriez obtenir: choisir celui qui semble le mieux pour vous.
Juste au cas où, voici mes réponses:
SELECT id,name FROM contacts WHERE email_address LIKE '%gmail%'
tables pluriel, colonnes singulier. Toujours une question d'opinion personnelle.Les conventions de nommage de permettre à l'équipe de développement pour la conception discovereability et la maintenabilité au cœur du projet.
Une bonne convention de nommage faut du temps pour évoluer, mais une fois en place, il permet à l'équipe d'aller de l'avant avec un langage commun. Une bonne convention de nommage croît naturellement avec le projet. Une bonne convention de nommage facilement se débrouille avec les changements au cours de la plus longue et la plus importante phase du cycle de vie logiciel - service gestion de la production.
Voici mes réponses:
De nommage est dur, mais dans toute organisation il y a quelqu'un qui soit capable de nommer les choses et dans tous les logiciels de l'équipe, il devrait être quelqu'un qui prend la responsabilité pour les dénominations des normes et assure que la nomenclature des questions comme sec_id, sec_value et security_id réglée au début avant d'être cuite dans le projet.
Quels sont donc les principes de base d'une bonne convention de nommage et de normes: -
votre solution de domaine
sont claires pour tout le monde
les noms de colonne
Voici un lien qui propose un peu de choix. J'étais à la recherche d'un simple spec j'ai pu suivre plutôt que d'avoir à compter sur une partie défini un.
http://justinsomnia.org/writings/naming_conventions.html
Lastname
devrait êtreLastName
Les noms de Table doivent toujours être au singulier, car ils représentent un ensemble d'objets. Comme vous le dites troupeau pour désigner un groupe de moutons, ou de troupeau ne désigner un groupe d'oiseaux. Pas besoin de pluriel. Quand un nom de table est la composition de deux noms et la convention de nommage est au pluriel, il devient difficile de savoir si le nom pluriel doit être le premier mot ou la deuxième mot ou deux.
C'est la logique de l'Objet.par exemple, pas les objets.exemple. Ou TableName.colonne, pas TableNames.la colonne(s).
Microsoft SQL n'est pas sensible à la casse, il est plus facile de lire les noms de table, si les majuscules sont utilisées pour les séparer de la table ou de la colonne des noms quand ils sont composés de deux noms ou plus.
User
est pas un groupe d'utilisateurs.Nom de la Table: Il devrait être au singulier, car il est une entité singulière qui représente un objet du monde réel et non pas des objets, ce qui est singlular.
Nom de la colonne: Il devrait être au singulier alors seulement il véhicule qu'elle tiendra une valeur atomique et confirmera à la théorie de normalisation. Si toutefois, il y a un nombre n de même type de propriétés, puis ils doivent être suffixé avec 1, 2, ..., n, etc.
Préfixer les Tables /Colonnes: C'est un énorme sujet, en discuter plus tard.
Boîtier: Il convient de Chameau cas
Mon ami, Patrick Karcher, je vous demande de ne pas écrire quoi que ce soit qui peuvent être choquants pour quelqu'un, comme vous l'avez écrit, "•en Outre, les clés étrangères doivent être nommés de manière cohérente dans les différents tableaux. Il devrait être légal de battre quelqu'un qui ne le fait pas.". Je n'ai jamais fait cette erreur mon ami Patrick, mais je suis de l'écriture en général. Que faire si ils prévoient, pour vous battre pour cela? 🙂
Très en retard à la fête, mais je voulais quand même ajouter mon grain de sel sur les préfixes de colonne
Il semble y avoir deux principaux arguments pour l'utilisation de la table_column (ou tableColumn) standard de nommage pour les colonnes, toutes deux basées sur le fait que le nom de la colonne elle-même sera unique dans l'ensemble de votre base de données:
1) Vous n'avez pas à spécifier les noms de table et/ou des alias de colonnes dans votre recherche de tous les temps
2) Vous pouvez facilement rechercher votre code entier pour le nom de la colonne
Je pense que les deux arguments sont fallacieux. La solution pour les problèmes sans l'aide de préfixes est facile. Voici ma proposition:
Toujours utiliser le nom de la table SQL. E. g., toujours utiliser le tableau.la colonne de la place de la colonne.
Il est évident qu'elle résout 2) que vous pouvez maintenant, il suffit de chercher pour le tableau.colonne au lieu de table_column.
Mais je ne vous entendra crier, comment permet-il de résoudre 1)? C'était exactement sur la façon d'éviter cela. Oui, il était, mais la solution a été terriblement erronée. Pourquoi? Ainsi, le préfixe de la solution se résume à:
Pour éviter d'avoir à spécifier la table.colonne quand il y a ambiguïté, de vous nommer tous vos colonnes table_column!
Mais cela signifie que vous allez TOUJOURS avoir à écrire le nom de la colonne à chaque fois que vous spécifiez une colonne. Mais si vous devez le faire de toute façon, quel est l'avantage sur toujours explicitement table d'écriture.la colonne? Exactement, il n'y a aucun avantage, c'est exactement le même nombre de caractères à taper.
edit: oui, je suis conscient que nommer les colonnes avec le préfixe impose l'utilisation correcte alors que mon approche s'appuie sur les programmeurs
Essentiel de la Base de données des Conventions de Nommage (et le Style) (cliquez ici pour une description plus détaillée)
les noms de table
choisissez court, sans ambiguïté des noms, en utilisant pas plus de un ou deux mots
distinguer facilement les tables
facilite l'attribution des noms uniques des noms de champ, ainsi que de recherche et de mise en relation des tables
donner les tables des noms singuliers, jamais au pluriel (mise à jour: je suis d'accord avec les raisons invoquées pour cette convention, mais la plupart des gens vraiment comme au pluriel les noms de table, donc j'ai adouci ma position)... suivez le lien ci-dessus, veuillez
e.g. PATIENTS would have a primary key called pa_patient_id_pk
!!Table des noms au singulier. Disons que vous avez été la modélisation de la relation entre la personne et son adresse.
Par exemple, si vous lisez un datamodel préférez-vous
"chaque personne peut vivre à 0,1 ou beaucoup d'adresse." ou
"chaque peuple peut vivre à 0,1 ou plusieurs adresses.'
Je pense que c'est plus facile de pluraliser l'adresse, plutôt que d'avoir à reformuler les gens comme personne. Plus les noms collectifs sont assez souvent dissimlar du singulier, version.
Ce sont les conventions qui me l'a appris, mais vous devrez vous adapter à ce que vous développement tuyau utilise.