Bueno, en realidad no es una descripción e Id significa "identidad", lo cual se explica por sí mismo. Esa es mi opinión.
Jean-Philippe Leclerc
49
Estoy seguro de que hay muchas tiendas que usan Id como nombre PK. Personalmente uso TableId como mi convención de nomenclatura, pero no le diría a nadie que ES LA ÚNICA MANERA VERDADERA. Parece que tu maestra solo está tratando de presentar su opinión como una mejor práctica ampliamente aceptada.
22
Definitivamente el tipo de mala práctica que no es tan mala. El punto es ser consistente. Si usa id, úselo en todas partes o no lo use.
deadalnix
57
Tienes una mesa ... se llama People, tiene una columna, llamada Id, ¿qué crees que es la Id? ¿Un coche? ¿Un barco? ... no, es la identificación de la gente, eso es todo. No creo que sea una mala práctica y no es necesario nombrar a la columna PK de otra manera que no sea Id.
Jim
38
¿Entonces el maestro se pone al frente de la clase y le dice que esta es una mala práctica sin una sola razón? Esa es una práctica peor para un maestro.
JeffO
Respuestas:
247
Voy a salir y decirlo: no es realmente una mala práctica (e incluso si lo es, no es tan mala).
Podría argumentar (como señaló Chad ) que puede enmascarar errores como en la siguiente consulta:
SELECT*FROM cars car
JOIN manufacturer mfg
ON mfg.Id = car.ManufacturerId
JOIN models mod
ON mod.Id = car.ModelId
JOIN colors col
ON mfg.Id = car.ColorId
pero esto se puede mitigar fácilmente al no usar pequeños alias para los nombres de su tabla:
SELECT*FROM cars
JOIN manufacturer
ON manufacturer.Id = cars.ManufacturerId
JOIN models
ON models.Id = cars.ModelId
JOIN colors
ON manufacturer.Id = cars.ColorId
La práctica de SIEMPRE usando abreviaturas de 3 letras me parece mucho peor que usar el nombre de la columna id. (Caso en cuestión: ¿quién realmente abreviaría el nombre de la tabla carscon la abreviatura car? ¿Para qué sirve eso?)
El punto es: ser consistente. Si su empresa usa Id y comúnmente comete el error anterior, entonces acostúmbrese a usar los nombres completos de las tablas. Si su empresa prohíbe la columna Id, tómela con calma y use la convención de nomenclatura que prefiera.
Concéntrese en aprender cosas que son REALMENTE malas prácticas (como múltiples subconsultas correlacionadas anidadas) en lugar de reflexionar sobre cuestiones como esta. La cuestión de nombrar las columnas "ID" está más cerca de ser una cuestión de gustos que de ser una mala práctica.
UNA NOTA PARA LOS EDITORES: El error en esta consulta es intencional y se está utilizando para hacer un punto. Lea la respuesta completa antes de editar.
@Chad, fue una referencia al hecho de que en esa consulta en particular usaste 3 letras para los alias de los nombres de las tablas, incluso cuando no tenía sentido ( cars-> car. Gracias a Dios, me salvaste los dedos). No leas demasiado profundamente.
Riwalk
3
peor que mis nombres de alias, fue mi mezcla de pluralidad carsy manufacturer. Uno es plural, el otro no. Si la gente quiere elegir en la base de datos, esa es la mala práctica que se debe elegir.
CaffGeek
3
Creo que es una mala práctica. Obviamente, en lo que respecta a las malas prácticas, no es terrible ... pero es tan fácil de evitar, ¿por qué no hacerlo? Ahora, estoy de acuerdo, para una clase de introducción, ¿es esto en lo que debe centrarse? Probablemente no ...
user606723
2
@ user606723, en realidad, creo que para una clase de introducción es importante destacar. La enseñanza de las mejores prácticas debe ser fundamental. No es hasta que tenga experiencia que comprende las consecuencias y las compensaciones y cuando debe desviarse de las mejores prácticas.
CaffGeek
55
@ Chad, acepta no estar de acuerdo. Intentar enseñar a los estudiantes las "mejores prácticas" sin permitirles comprender por qué esas son las mejores prácticas es un esfuerzo inútil. Y como no puedes cubrir todo, pasar por alto este punto con "simplemente no deberías hacerlo, descubrirás por qué más tarde" es una elección bastante sensata desde el punto de vista de un profesor. Los estudiantes curiosos pueden publicar aquí o, con suerte, encontrar esta pregunta ya respondida. (O pregunte después de la clase)
user606723
123
Porque cuando tienes una tabla con una clave foránea no puedes nombrar esa clave foránea "Id". Tienes el nombre de la tabla TableId
Y entonces tu unión parece
SELECT*FROM cars c JOIN manufacturer m ON m.Id = c.ManufacturerId
E idealmente, su condición debe tener el mismo nombre de campo en cada lado
SELECT*FROM cars c JOIN manufacturer m ON m.ManufacturerId = c.ManufacturerId
Entonces, aunque parece redundante nombrar el Id como Id. De fabricante, hace que sea menos probable que tenga errores en las condiciones de unión, ya que los errores se vuelven obvios.
Esto parece simple, pero cuando une varias tablas, es más probable que cometa un error, encuentre la siguiente ...
SELECT*FROM cars car
JOIN manufacturer mfg
ON mfg.Id = car.ManufacturerId
JOIN models mod
ON mod.Id = car.ModelId
JOIN colors col
ON mfg.Id = car.ColorId
Mientras que con un nombre adecuado, el error sobresale ...
SELECT*FROM cars car
JOIN manufacturer mfg
ON mfg.ManufacturerId = car.ManufacturerId
JOIN models mod
ON mod.ModelId = car.ModelId
JOIN colors col
ON mfg.ManufacturerId = car.ColorId
Otra razón por la que nombrarlos Id es "incorrecta" es que cuando consulta información de varias tablas, deberá cambiar el nombre de las columnas Id para poder distinguirlas.
No estoy seguro de que esta sea una explicación lo suficientemente buena para mí. No hay nada malo en decirlo SELECT * FROM cars c JOIN manufacturer m ON manufacturer.Id = c.ManufacturerId. Lo he usado iddurante años y nunca encontré lo que describiste como un problema real.
Riwalk
61
Yo diría que la mala práctica aquí es alias de tablas con nombre como mfg o mod. fabricantes.id = cars.manufacturer_id es muy legible y el error también se mantendrá.
deadalnix
55
@Chad> Ya tengo problemas con nombres de variables tontos. Muchas veces. Para la grabación, aquí lo que le diría a un desarrollador que hace esto en mi equipo "mfg no significa fabricante, significa que eres perezoso para escribir fabricante".
deadalnix
99
@ Stargazer712: Al hacer SELECT * desde 2 tablas se obtienen 2 x columnas de ID. La identificación ahora es ambigua: ¿hace referencia por ordinal o nombre? SELECT * tampoco es una buena práctica. Pobres argumentos. Código frágil Chad tiene razón: básicamente la codificación defensiva
gbn
66
@gbn, nuevamente, toda ambigüedad desaparece si simplemente lo haces SELECT manufacturer.id FROM .... Cada dificultad resultante idpuede superarse muy fácilmente, por lo que es simplemente una cuestión de gustos.
Riwalk
67
La biblioteca ActiveRecord de Ruby y GORM de Groovy usan "id" para la clave sustituta por defecto. Me gusta esta practica. Duplicar el nombre de la tabla en el nombre de cada columna es redundante, tedioso de escribir y más tedioso de leer.
+1 para "y más tedioso de leer". - las convenciones de nomenclatura no deben considerarse como una curita para el código descuidado, sino que deben mejorar la legibilidad como una preocupación principal.
ocodo
12
La identificación es mucho más tediosa de leer
HLGEM
55
@HLGEM: siempre se puede calificar el nombre de la columna con el nombre de la tabla.
Kevin Cline
2
Estoy de acuerdo, excepto por el más tedioso de leer. De hecho, prefiero leer nombres de columnas más descriptivos y pasar menos tiempo averiguando para qué sirve realmente esa columna.
Devin Dixon
2
+1, Odio ver tablas con columnas como Posts.postID, Posts.postName donde simplemente usar post.id y post.name es mucho más bonito.
Doug
40
Los nombres de columna comunes o clave como "Nombre" o "Id" deben tener el prefijo TableName.
Elimina la ambigüedad, es más fácil de buscar, significa mucho menos alias de columna cuando se necesitan ambos valores "Id".
Una columna de menor uso o auditoría o no clave (por ejemplo, LastUpdatedDateTime) no importa
¡Si haces esto, te odio por hacerme escribir más! El nombre de la tabla es Persona, ¿cuál crees que será el Id? ¿Coche? No, es persona.
Jim
16
@ Jim, no sé tú, pero escribir 6 caracteres adicionales me lleva aproximadamente medio segundo. Y teniendo en cuenta que rara vez selecciono de una tabla, y por lo tanto terminaría con dos columnas llamadas 'Id' y de todos modos necesitaré incluir el nombre de la tabla / alias, no hay ahorro en la cantidad de caracteres escritos.
CaffGeek
21
@Chad Me parece superfluo. si estoy haciendo una unión, c.id = m.manufactrid, está bien conmigo. Estas columnas generalmente se "asignan" a una clase de alguna manera, y para tener una clase con Person.PersonId me dan ganas de vomitar ... Sí, soy plenamente consciente de que tengo problemas.
Jim
20
También estoy en desacuerdo con esto. ¿Por qué parar en namey id? ¿Por qué no tener cada columna con el nombre de la tabla como prefijo? Parece arbitrario elegir esos dos nombres para ordenar un prefijo. Conceptualmente, debe tener la tabla para tener el contexto de una columna de todos modos. ¿Por qué no usar el nombre de la tabla para aclarar la consulta: Person.Name, Animal.Name, Part.Name, ...
Thomas
11
@Bill Leeper, DRY no siempre es apropiado en el desarrollo de bases de datos. En las bases de datos, lo importante es el rendimiento y hacer que la base de datos haga un trabajo adicional para completar los principios DRY (como usar funciones escalares o vistas que llaman vistas o consultas que devuelven demasiadas columnas o usar un cursor para agregar 1000000 registros para usar un proceso existente) A menudo está contraindicado. No piense que solo porque algo es bueno en el mundo orientado a objetos es apropiado en el diseño de la base de datos. Su voto negativo fue inapropiado. Usar ID es un antipatrón SQL conocido.
HLGEM
31
Este hilo está muerto, pero me gustaría agregar que no usar IMO Ides una mala práctica. La Idcolumna es especial; Es la clave principal. Cualquier tabla puede tener cualquier número de claves externas, pero solo puede tener una clave primaria. En una base de datos donde se llaman todas las claves primarias Id, tan pronto como mira la tabla, sabe exactamente qué columna es la clave primaria.
Créame, durante meses he pasado todo el día todos los días trabajando en muchas bases de datos grandes (Salesforce) y lo mejor que puedo decir sobre los esquemas es que cada tabla tiene una clave primaria llamada Id. Les puedo asegurar que nunca me confundo acerca de unir una clave primaria a una clave externa porque se llama a la PK Id. Otra cosa que la gente no ha mencionado es que las tablas pueden tener nombres largos y tontos como Table_ThatDoesGood_stuff__c; ese nombre es bastante malo porque el arquitecto tuvo una resaca la mañana en que pensó en esa tabla, pero ahora me está diciendo que es una mala práctica no llamar a la clave principal Table_ThatDoesGood_stuff__cId (recordando que los nombres de columna SQL no distinguen entre mayúsculas y minúsculas en general).
Para ser sincero, los problemas con la mayoría de las personas que enseñan programación de computadoras son que no han escrito una línea de código de producción en años, si es que alguna vez, y no tienen idea de lo que realmente hace un ingeniero de software en funcionamiento. Espere hasta que comience a trabajar y luego decida qué cree que es una buena idea o no.
Ese es solo el caso si ninguna de sus claves principales es una clave compuesta, lo cual, desafortunadamente, es el caso con demasiada frecuencia. Realmente solo se deben usar claves sustitutas en circunstancias particulares.
nicodemus13
66
Al usar una identificación como esa, terminas en una situación en la que, sin pensar, los desarrolladores agregan la identificación de la clave principal a todas y cada una de las tablas que crean. Una de las bases de las bases de datos relacionales es el uso de claves primarias significativas y agregadas, y el uso de id no ayuda.
Pieter B
Parece que esta respuesta dice "Prefiero Id" con argumentos obstinados. Su argumento es que puede ver instantáneamente qué clave es la clave principal al encontrar la llamada Id. Bueno, es exactamente lo mismo con tableId . Puedo garantizarle que nunca me confundo qué tecla es la clave principal tampoco. Solo busco el que tiene el nombre de la tabla antes de la identificación. No solo eso, sino con qué tipo de tablas paganas estás trabajando donde la primera columna no es la clave principal. Siento que todos sus argumentos en esta respuesta tienen una base puramente preferencial y son similares a "tableId me parece mal".
dallin
@dallin todas las respuestas son obstinadas, de lo contrario, alguien simplemente se vincularía al estándar oficial, ¡y no hay una!
James
@ James Creo que el objetivo de los sitios de StackExchange es reducir las respuestas obstinadas. Es por eso que las preguntas se cierran por ser demasiado obstinadas. De acuerdo, creo que esa es la razón por la cual esta pregunta se cerró, porque genera respuestas obstinadas, pero creo que esta respuesta específica fue excesivamente obstinada sin ningún hecho o argumento de apoyo real basado en hechos. La respuesta completa se puede resumir diciendo: "En mi opinión, deberías usar Id, solo porque eso es lo que me gusta ". Esa no es una respuesta valiosa.
dallin
24
No lo considero una mala práctica. La consistencia es el rey, como siempre.
Creo que todo se trata de contexto. En el contexto de la tabla en sí misma, "id" solo significa exactamente lo que espera, una etiqueta para ayudar a identificarlo de manera única frente a otros que de otro modo podrían ser (o parecer) idénticos.
En el contexto de las uniones, es su responsabilidad construir las uniones de tal manera que sean legibles para usted y su equipo. Del mismo modo que es posible hacer que las cosas parezcan difíciles con frases o nombres pobres, es igualmente posible construir una consulta significativa con el uso efectivo de alias e incluso comentarios.
De la misma manera que una clase Java llamada 'Foo' no tiene sus propiedades prefijadas por 'Foo', no se sienta obligado a prefijar sus ID de tabla con nombres de tabla. Por lo general, está claro en contexto a qué se refiere el ID.
Las tablas de bases de datos relacionales no son clases .
Adam Robinson
1
Sin embargo, son estructuras de datos y son análogas a las clases PODO. Se aplican los mismos problemas de nombres.
ocodo
44
@Slomojo: No, no son análogos a los objetos simples. El diseño orientado a objetos y el diseño de bases de datos no son lo mismo, y ni siquiera están relacionados. Si bien pueden, en algunos casos, producir un diseño similar (o incluso el mismo), eso no indica que estén relacionados. Por ejemplo, las relaciones m: m son triviales en las clases, pero son imposibles de tener entre dos tablas sin una tercera tabla de asociación.
Adam Robinson
1
No sé cómo se relaciona esto con una estrategia de nombres. Mi analogía es (¿claramente?) Solo en ese sentido.
ocodo
2
Lamento que mi significado implícito no fuera muy claro, debería haber dicho " en este sentido son análogos a las clases". De cualquier manera, no creo que ser demasiado pedante sea particularmente constructivo. En términos de nomenclatura, las tablas y las clases comparten una cantidad significativa de similitudes. Las mejores prácticas que se desarrollan en un callejón sin salida son un juego justo para la revisión, o al menos están abiertas a discusión. Hay muchas preguntas y respuestas que ilustran esto de manera efectiva, no tengo nada más que agregar.
Mi conjetura en los FKs, basado en los nombres: PostTypeId -> PostTypes.Id; AcceptedAnswerId -> Answers.Id; OwnerUserId -> Users.Id. ¿Por qué una práctica que es así de fácil debe considerarse "mala"?
Sjoerd
3
¿Cómo prueba esto algo sobre las mejores prácticas?
GBa
55
Si algo se usa en la pila o no, no prueba si es una buena o mala práctica.
Pieter B
2
Lo que sí prueba es que esta práctica de ninguna manera prohíbe la escalabilidad y la utilidad de una aplicación.
Cypher
1
En realidad, la práctica SO no es perfecta. Usaría este nombre: PostType -> PostType.Id; Respuesta aceptada -> Answer.Id; OwnerUser -> User.Id
alpav
17
Hace que sea difícil (y confuso) realizar una unión natural en la mesa, por lo tanto, es malo, si no muy malo.
Natural Join es un antiguo artefacto de SQL Lore (es decir, álgebra relacional) que puede haber visto uno de estos: ⋈ en un libro de base de datos, tal vez. Lo que quiero decir es que Natrual Join no es una idea SQL nueva e incómoda, aunque pareciera que los DBMS tardaron una eternidad en implementarla, por lo tanto, no es una idea nueva e ingeniosa para que la implementen, incluso podría ser irracional ignorarla su existencia hoy en día.
Bueno, si nombra todas las ID de su clave principal, entonces pierde la facilidad y simplicidad de la unión natural. select * from dudes natural join carsnecesitará ser escrito select * from dudes inner join cars where cars.dudeid = dudes.ido select * from dudes inner join cars where dudes.carid = cars.id. Si puedes hacer una unión natural, puedes ignorar cuál es la relación, lo cual, creo, es bastante impresionante.
A menos que esté escribiendo un procedimiento almacenado, ¿cuándo es la última vez que, como desarrollador de aplicaciones, escribió un selector de SQL completamente formateado? Todos los idiomas modernos incluyen algún tipo de función ORM que gestiona esta relación por usted. El nombre de la columna es mucho más importante que poder escribir SQL manual limpio.
Bill Leeper
44
@Bill que hago todo el tiempo, muchas, muchas veces al día, depende más de tu base de código que del lenguaje que estás desarrollando. Y, para el diagnóstico, si desea hacer algunas buenas y profundas relaciones, puede unir esas uniones naturales y evitar por completo buscar ID de campo. Y, como dijo San Jerónimo, "La ignorancia de SQL es la ignorancia de las bases de datos".
Peter Turner
Además del hecho de que las uniones naturales no son universalmente compatibles, en mi opinión, las uniones naturales son más difíciles de leer. ¿Hay dos columnas en relación o solo una? Mucho mejor ser explícito y evitar uniones naturales.
Thomas
1
@ Thomas, tampoco pondría uniones naturales en el código, pero para el diagnóstico, las encontré bastante útiles cuando la base de datos está modelada para que realmente funcionen.
Peter Turner
16
Hay una situación en la que pegar "ID" en cada tabla no es la mejor idea: la USINGpalabra clave, si es compatible. Lo usamos a menudo en MySQL.
Por ejemplo, si tiene fooTableuna columna fooTableIdy barTableuna clave foránea fooTableId, entonces sus consultas se pueden construir de la siguiente manera:
SELECT fooTableId, fooField1, barField2 FROM fooTable INNERJOIN barTable USING(fooTableId)
No solo guarda la escritura, sino que es mucho más legible en comparación con la alternativa:
Esta es la respuesta que más me llama la atención. La USINGpalabra clave es compatible con la base de datos postgres / mysql / sqlite, significa menos tipeo que algunas de las otras respuestas enumeran como una razón para usar id, y finalmente en mi opinión subjetiva es más legible.
Michael Barton el
11
¿Por qué no solo le preguntas a tu maestro?
Piense en esto, cuando se nombran todas las columnas PK de sus tablas, es IDuna pesadilla usarlas como claves foráneas.
Los nombres de columna deben ser semánticamente significativos. IDes genérico
@ Jim de qué mesa? idsolo no significa nada, especialmente en el contexto de una clave externa para otra tabla. Esto no tiene nada que ver con classestodo y tiene que ver con un buen diseño básico básico de base de datos relacional.
10
Para ser un poco fatuo, la tabla a la que pertenece. table.ides una forma perfectamente aceptable de referirse a un idcampo. Prefijar el nombre del campo con el nombre de la tabla es redundante.
ocodo
2
@Slomoj no es más tipear que incluir el nombre en la columna y es más explícito al asignar alias de nombres de tablas a abreviaturas de letras simples o dobles en uniones de monstruos.
66
¿De qué pesadilla te refieres? Suponga que tiene una estructura de auto-referencia de empleados con una columna que representa a su gerente. ¿Cómo se llama la clave foránea? No puede llamarlo EmployeeId, ya que presumiblemente es su PK. El nombre del FK no tiene que coincidir con el PK. Debe nombrarse por lo que representa para la entidad en la que está contenido.
Thomas
7
La identificación es mala por las siguientes razones:
Si realiza muchas consultas de informes, siempre debe asignar un alias a las columnas si desea ver ambas. Entonces, para empezar, se convierte en una pérdida de tiempo cuando podrías nombrarlo correctamente. Estas consultas complejas son bastante difíciles (escribo consultas que pueden tener cientos de líneas de largo) sin la carga adicional de hacer un trabajo innecesario.
Está sujeto a causar errores de código. Si usa una base de datos que permite el uso de la unión natural (no creo que deba usarla alguna vez, pero cuando las características estén disponibles, alguien las usará), se unirá en lo incorrecto si obtiene un desarrollador que la use.
Si está copiando combinaciones para crear una consulta compleja, es fácil olvidarse de cambiar el alias al que desea y obtener una combinación incorrecta. Si cada identificación lleva el nombre de la tabla en la que se encuentra, generalmente obtendrá un error de sintaxis. También es más fácil detectar si la combinación en una consulta compleja es incorrecta si el nombre de pPK y el nombre de FK coinciden.
+1: Estas son razones convincentes en mi opinión, mientras que las otras respuestas opuestas IDno me convencen en absoluto.
phoog
Re: "Si está copiando uniones para crear una consulta compleja", entonces su problema es copiar y pegar. Deje de copiar y pegar y verá lo conveniente que es nombrar car.id. Para unirse a FK, use car.mfg = mfg.id, car.color = color.id, car.model = model.id, muy simple y coincide con lo que escribiría en LINQ.
alpav
Intenta escribir algo con 30 combinaciones y verás por qué es un antipatrón.
HLGEM
El alias es la primera y principal razón: es un dolor de cabeza cuando se hacen grandes informes complejos. Las uniones naturales son solo una dulce ventaja. Es sorprendente cómo otras respuestas simplemente ignoran estos puntos. Creo que agregar algunos ejemplos aclararía el punto y elevaría esta respuesta a donde debería estar.
Lulu
5
Hay algunas respuestas que se acercan a lo que yo consideraría la razón más importante para no usar "id" como el nombre de la columna para la clave primaria en una tabla: es decir, consistencia y reducción de la ambigüedad.
Sin embargo, para mí, el programador de mantenimiento obtiene el beneficio clave, en particular uno que no participó en el desarrollo original. Si usó el nombre "PersonID" para la ID en la tabla Person y usó ese nombre como una clave foránea, es trivial escribir una consulta en el esquema para averiguar qué tablas tienen PersonID sin tener que inferir ese "PersonID" es el nombre usado cuando es una clave foránea. Recuerde, correcto o incorrecto, las relaciones de claves externas no siempre se aplican en todos los proyectos.
Hay un caso extremo en el que una tabla puede necesitar tener dos claves externas para la misma tabla, pero en tales casos pondría el nombre de la clave original como el nombre del sufijo para la columna, por lo que una coincidencia de comodín,% PersonID, podría encontrar fácilmente esas instancias también.
Sí, gran parte de esto podría lograrse mediante un estándar de tener "id" y saber usarlo siempre como "tableNameID", pero eso requiere tanto saber que la práctica está en su lugar y depender de los desarrolladores originales para seguir adelante con un menor Práctica estándar intuitiva.
Si bien algunas personas han señalado que requiere algunos golpes de tecla adicionales para escribir los nombres de columna más largos, diría que escribir el código es solo una pequeña fracción de la vida activa del programa. Si el objetivo era guardar las pulsaciones de teclas del desarrollador, los comentarios nunca deberían escribirse.
Como alguien que ha pasado muchos años manteniendo proyectos grandes con cientos de tablas, preferiría nombres consistentes para una clave en todas las tablas.
Supongamos que una Companiestabla tiene 2 claves foráneas para una Personstabla. Uno representa al presidente de la compañía; el otro representa al Tesorero de la compañía. ¿Realmente llamarías a las columnas PersonID1y PersonID2? Sería mucho más descriptivo llamarlos PresidentIDy TreasurerID. Me resulta mucho más fácil de leer inner join Person AS Presidents ON Company.PresidentID = Presidents.IDqueinner join Person AS Person1 ON Company.PersonID1 = Person1.PersonID
phoog
1
No. En su ejemplo, probablemente tendría una tabla CompanyOfficero CompanyPersontabla que permita una relación de muchos a muchos entre Companyy Personcon información adicional sobre la naturaleza de la relación. Si Companytuviera que implementarlo dentro de la tabla, usaría los nombres de columna PresidentPersonIDy TreasurerPersonIDpara preservar la parte * PersonID del nombre al agregar el descriptor adicional. inner join Person as Presidents on Company.PresidentPersonID = Presidents.PersonID
Malaquías
5
La práctica de usar Id como campo de clave principal conduce a la práctica donde se agrega id a cada tabla. Muchas tablas ya tienen información única que identifica de forma única un registro. Use ESO como clave principal y no como un campo de identificación que agregue a todas y cada una de las tablas. Esa es una de las bases de las bases de datos relacionales.
Y es por eso que usar id es una mala práctica: a menudo, id no es información, solo un aumento automático.
considere las siguientes tablas:
PK id | Countryid | Countryname
1|840| United States
2|528| the Netherlands
Lo que está mal con esta tabla es que permite al usuario agregar otra línea: Estados Unidos, con el código de país 840. Simplemente rompió la integridad relacional. Por supuesto, puede imponer la unicidad en columnas individuales, o simplemente puede usar una clave principal que ya está disponible:
PK Countryid | Countryname
840| United States
528| the Netherlands
De esa manera, utiliza la información que ya tiene como clave principal, que es el núcleo del diseño de la base de datos relacional.
Comprenderá por qué las personas agregan una columna de clave genérica a cada tabla cuando ha tenido que migrar bases de datos entre sistemas diferentes, o ha tenido el placer de fusionar bases de datos.
Cypher
1
Este es ocasionalmente el caso, pero en mi experiencia es bastante raro tener una clave inmutable única y agradable. Pero incluso en su ejemplo, tiene un número único sin sentido para identificar países, solo uno asignado por ISO, no por su base de datos.
CodesInChaos
Y ahora, cuando cambia el nombre del país, debe actualizarlo en toda su base de datos para solucionarlo. Si simplemente hubiera usado una clave sustituta (como ... "id"), la actualización sería trivial. Las claves naturales son geniales, cuando son completamente inmutables y nunca cambian. En realidad, hay muy pocos casos en los que esto sea cierto.
Gerrat
@Gerrat: Si cambia el nombre de un país, el código numérico ISO 3166-1 permanece igual, solo cambian los códigos alfa 31 y alfa 3 de ISO 3166-1. Esto sucedió con Birmania / Myanmar, por ejemplo. Del mismo modo, si un país cambia su territorio pero mantiene su nombre, el código numérico ISO 3166-1 cambia, pero los códigos alfa 31 y alfa 3 de ISO 3166-1 permanecen. Esto sucedió cuando Sudán del Sur se separó de Sudán y Eritrea se separó de Etiopía. Cuando Alemania Oriental y Occidental se reunieron, mantuvieron los códigos alfa-2 y alfa-3 de Alemania Occidental, pero obtuvieron un nuevo código numérico. Cuando los países se disuelven o transforman por completo (piense ...
Jörg W Mittag
... resultado de las guerras de los Balcanes de los 90), obtienen nuevos códigos numéricos y alfa-2 y alfa-3.
Jörg W Mittag
4
Siempre uso 'id' como el nombre de columna principal para cada tabla simplemente porque es la convención de los marcos que uso (Ruby on Rails, CakePHP), por lo que no tengo que anularlo todo el tiempo.
No creo que sea una mala práctica si se usa correctamente. Es común tener un campo de ID de incremento automático llamado "ID" que nunca tiene que tocar, y usar un identificador más amigable para la aplicación. Escribir un código puede ser un poco engorroso, from tableA a inner join tableB b on a.id = b.a_idpero ese código se puede guardar.
Como preferencia personal, tiendo a prefijar el Id con el nombre de la entidad, pero no veo un problema real con solo usarlo Idsi es manejado completamente por la base de datos.
Nunca uniría dos tablas por cada clave principal, especialmente una identificación de incremento automático. El ejemplo anterior sería de la tabla A, una tabla de unión interna B b en a.id = b.table_a_id.
Bill Leeper
Sí, a eso me refería. Casi la hora del almuerzo y necesita energía.
Wayne Molina
2
La identificación es lo suficientemente común, que no creo que pueda confundir a nadie. Siempre vas a querer saber la mesa. Poner nombres de campos en el código de producción sin incluir una tabla / alias es una mala práctica. Si está demasiado preocupado por poder escribir rápidamente consultas ad hoc, está solo.
Solo espero que nadie desarrolle una base de datos SQL donde ID sea una palabra reservada.
CREATETABLE CAR (ID);
Se encarga del nombre del campo, la clave primaria y los incrementos automáticos en 1, comenzando con 1 todo en un pequeño y agradable paquete de 2 caracteres. Ah, y lo habría llamado CARS, pero si vamos a ahorrar en la pulsación de teclas y ¿quién cree realmente que una mesa llamada CAR solo tendrá uno?
Esto muestra por qué el conocimiento de la teoría relacional formal es importante, el nombre de la tabla representa lo que es una sola fila . La tabla Carrepresenta un Tabledonde cada uno Rowrepresenta un solo Car. Llamar Carscambia la semántica y muestra una completa falta de comprensión de los principios básicos de la teoría relacional formal. Rails es un excelente ejemplo de alguien que sabía lo suficiente como para ser peligroso .
2
Esta pregunta ha sido superada una y otra vez, pero pensé que yo también agregaría mi opinión.
Utilizo id para significar que ese es el identificador de cada tabla, por lo que cuando me uno a una tabla y necesito la clave primaria, automáticamente me uno a la clave primaria.
El campo id es un incremento automático, sin signo (lo que significa que nunca tengo que establecer su valor y no puede ser negativo)
Para las claves externas, uso tablenameid (nuevamente una cuestión de estilo), pero la clave principal a la que me uno es el campo id de la tabla, por lo que la coherencia significa que siempre puedo verificar las consultas fácilmente
la identificación es corta y dulce también
Convención adicional: utilice minúsculas para todos los nombres de tablas y columnas, de modo que no se encuentren problemas debido a mayúsculas y minúsculas
Otra cosa a considerar es que si el nombre de la clave primaria es diferente del nombre de la clave externa, entonces no es posible usar ciertas herramientas de terceros.
Por ejemplo, no podría cargar su esquema en una herramienta como Visio y hacer que produzca ERD precisos.
Sin embargo, eso sería culpa de la herramienta de terceros. Las convenciones de nomenclatura de columnas no sustituyen las claves foráneas reales, que la herramienta debería introspectar.
Gerrat
1
Encuentro que la gente aquí cubre casi todos los aspectos, pero quiero agregar que "id" no es y no debe leerse como "identificador", es más un "índice" y seguramente no establece ni describe la identidad de la fila. (Es posible que haya utilizado una redacción incorrecta aquí, corríjame si lo hice)
Es más o menos cómo las personas leen los datos de la tabla y cómo escriben su código. Personalmente y muy probablemente esta es la forma más popular que veo con más frecuencia es que los codificadores escriben la referencia completa como table.id, incluso si no necesitan hacer uniones sindicales y / o unidas. Por ejemplo:
SELECT cars.color, cars.model FROM cars WHERE cars.id =<some_var>
De esa manera, puede traducirlo al inglés como "Dame el color y el modelo de ese auto numerado como". y no como "Dame el color y el modelo de ese auto identificado como número". La identificación no representa el automóvil de ninguna manera, es solo el índice del automóvil, un número de serie si lo desea. Justo como cuando quieres tomar el tercer elemento de una matriz.
Entonces, para resumir, lo que quería agregar es que es solo una cuestión de preferencia y la forma descrita de leer SQL es la más popular.
Sin embargo, hay algunos casos en los que esto no se usa, como (un ejemplo mucho más raro) cuando la ID es una cadena que realmente describe. Por ejemplo id = "RedFordMustang1970"o algo similar. Realmente espero poder explicar esto al menos para tener una idea.
Respuestas:
Voy a salir y decirlo: no es realmente una mala práctica (e incluso si lo es, no es tan mala).
Podría argumentar (como señaló Chad ) que puede enmascarar errores como en la siguiente consulta:
pero esto se puede mitigar fácilmente al no usar pequeños alias para los nombres de su tabla:
La práctica de SIEMPRE usando abreviaturas de 3 letras me parece mucho peor que usar el nombre de la columna
id
. (Caso en cuestión: ¿quién realmente abreviaría el nombre de la tablacars
con la abreviaturacar
? ¿Para qué sirve eso?)El punto es: ser consistente. Si su empresa usa Id y comúnmente comete el error anterior, entonces acostúmbrese a usar los nombres completos de las tablas. Si su empresa prohíbe la columna Id, tómela con calma y use la convención de nomenclatura que prefiera.
Concéntrese en aprender cosas que son REALMENTE malas prácticas (como múltiples subconsultas correlacionadas anidadas) en lugar de reflexionar sobre cuestiones como esta. La cuestión de nombrar las columnas "ID" está más cerca de ser una cuestión de gustos que de ser una mala práctica.
UNA NOTA PARA LOS EDITORES: El error en esta consulta es intencional y se está utilizando para hacer un punto. Lea la respuesta completa antes de editar.
fuente
cars
->car
. Gracias a Dios, me salvaste los dedos). No leas demasiado profundamente.cars
ymanufacturer
. Uno es plural, el otro no. Si la gente quiere elegir en la base de datos, esa es la mala práctica que se debe elegir.Porque cuando tienes una tabla con una clave foránea no puedes nombrar esa clave foránea "Id". Tienes el nombre de la tabla TableId
Y entonces tu unión parece
E idealmente, su condición debe tener el mismo nombre de campo en cada lado
Entonces, aunque parece redundante nombrar el Id como Id. De fabricante, hace que sea menos probable que tenga errores en las condiciones de unión, ya que los errores se vuelven obvios.
Esto parece simple, pero cuando une varias tablas, es más probable que cometa un error, encuentre la siguiente ...
Mientras que con un nombre adecuado, el error sobresale ...
Otra razón por la que nombrarlos Id es "incorrecta" es que cuando consulta información de varias tablas, deberá cambiar el nombre de las columnas Id para poder distinguirlas.
Con nombres precisos, esto no es un problema
fuente
SELECT * FROM cars c JOIN manufacturer m ON manufacturer.Id = c.ManufacturerId
. Lo he usadoid
durante años y nunca encontré lo que describiste como un problema real.SELECT manufacturer.id FROM ...
. Cada dificultad resultanteid
puede superarse muy fácilmente, por lo que es simplemente una cuestión de gustos.La biblioteca ActiveRecord de Ruby y GORM de Groovy usan "id" para la clave sustituta por defecto. Me gusta esta practica. Duplicar el nombre de la tabla en el nombre de cada columna es redundante, tedioso de escribir y más tedioso de leer.
fuente
Los nombres de columna comunes o clave como "Nombre" o "Id" deben tener el prefijo TableName.
Elimina la ambigüedad, es más fácil de buscar, significa mucho menos alias de columna cuando se necesitan ambos valores "Id".
Una columna de menor uso o auditoría o no clave (por ejemplo, LastUpdatedDateTime) no importa
fuente
name
yid
? ¿Por qué no tener cada columna con el nombre de la tabla como prefijo? Parece arbitrario elegir esos dos nombres para ordenar un prefijo. Conceptualmente, debe tener la tabla para tener el contexto de una columna de todos modos. ¿Por qué no usar el nombre de la tabla para aclarar la consulta: Person.Name, Animal.Name, Part.Name, ...Este hilo está muerto, pero me gustaría agregar que no usar IMO
Id
es una mala práctica. LaId
columna es especial; Es la clave principal. Cualquier tabla puede tener cualquier número de claves externas, pero solo puede tener una clave primaria. En una base de datos donde se llaman todas las claves primariasId
, tan pronto como mira la tabla, sabe exactamente qué columna es la clave primaria.Créame, durante meses he pasado todo el día todos los días trabajando en muchas bases de datos grandes (Salesforce) y lo mejor que puedo decir sobre los esquemas es que cada tabla tiene una clave primaria llamada
Id
. Les puedo asegurar que nunca me confundo acerca de unir una clave primaria a una clave externa porque se llama a la PKId
. Otra cosa que la gente no ha mencionado es que las tablas pueden tener nombres largos y tontos comoTable_ThatDoesGood_stuff__c
; ese nombre es bastante malo porque el arquitecto tuvo una resaca la mañana en que pensó en esa tabla, pero ahora me está diciendo que es una mala práctica no llamar a la clave principalTable_ThatDoesGood_stuff__cId
(recordando que los nombres de columna SQL no distinguen entre mayúsculas y minúsculas en general).Para ser sincero, los problemas con la mayoría de las personas que enseñan programación de computadoras son que no han escrito una línea de código de producción en años, si es que alguna vez, y no tienen idea de lo que realmente hace un ingeniero de software en funcionamiento. Espere hasta que comience a trabajar y luego decida qué cree que es una buena idea o no.
fuente
No lo considero una mala práctica. La consistencia es el rey, como siempre.
Creo que todo se trata de contexto. En el contexto de la tabla en sí misma, "id" solo significa exactamente lo que espera, una etiqueta para ayudar a identificarlo de manera única frente a otros que de otro modo podrían ser (o parecer) idénticos.
En el contexto de las uniones, es su responsabilidad construir las uniones de tal manera que sean legibles para usted y su equipo. Del mismo modo que es posible hacer que las cosas parezcan difíciles con frases o nombres pobres, es igualmente posible construir una consulta significativa con el uso efectivo de alias e incluso comentarios.
De la misma manera que una clase Java llamada 'Foo' no tiene sus propiedades prefijadas por 'Foo', no se sienta obligado a prefijar sus ID de tabla con nombres de tabla. Por lo general, está claro en contexto a qué se refiere el ID.
fuente
De data.stackexchange.com
BOOM, pregunta respondida.
Ahora ve a decirle a tu maestro que SO practica mal el diseño de la base de datos.
fuente
PostTypeId -> PostTypes.Id
;AcceptedAnswerId -> Answers.Id
;OwnerUserId -> Users.Id
. ¿Por qué una práctica que es así de fácil debe considerarse "mala"?Hace que sea difícil (y confuso) realizar una unión natural en la mesa, por lo tanto, es malo, si no muy malo.
Natural Join es un antiguo artefacto de SQL Lore (es decir, álgebra relacional) que puede haber visto uno de estos: ⋈ en un libro de base de datos, tal vez. Lo que quiero decir es que Natrual Join no es una idea SQL nueva e incómoda, aunque pareciera que los DBMS tardaron una eternidad en implementarla, por lo tanto, no es una idea nueva e ingeniosa para que la implementen, incluso podría ser irracional ignorarla su existencia hoy en día.
Bueno, si nombra todas las ID de su clave principal, entonces pierde la facilidad y simplicidad de la unión natural.
select * from dudes natural join cars
necesitará ser escritoselect * from dudes inner join cars where cars.dudeid = dudes.id
oselect * from dudes inner join cars where dudes.carid = cars.id
. Si puedes hacer una unión natural, puedes ignorar cuál es la relación, lo cual, creo, es bastante impresionante.fuente
Hay una situación en la que pegar "ID" en cada tabla no es la mejor idea: la
USING
palabra clave, si es compatible. Lo usamos a menudo en MySQL.Por ejemplo, si tiene
fooTable
una columnafooTableId
ybarTable
una clave foráneafooTableId
, entonces sus consultas se pueden construir de la siguiente manera:No solo guarda la escritura, sino que es mucho más legible en comparación con la alternativa:
fuente
USING
palabra clave es compatible con la base de datos postgres / mysql / sqlite, significa menos tipeo que algunas de las otras respuestas enumeran como una razón para usarid
, y finalmente en mi opinión subjetiva es más legible.¿Por qué no solo le preguntas a tu maestro?
Piense en esto, cuando se nombran todas las columnas PK de sus tablas, es
ID
una pesadilla usarlas como claves foráneas.Los nombres de columna deben ser semánticamente significativos.
ID
es genéricofuente
id
solo no significa nada, especialmente en el contexto de una clave externa para otra tabla. Esto no tiene nada que ver conclasses
todo y tiene que ver con un buen diseño básico básico de base de datos relacional.table.id
es una forma perfectamente aceptable de referirse a unid
campo. Prefijar el nombre del campo con el nombre de la tabla es redundante.La identificación es mala por las siguientes razones:
Si realiza muchas consultas de informes, siempre debe asignar un alias a las columnas si desea ver ambas. Entonces, para empezar, se convierte en una pérdida de tiempo cuando podrías nombrarlo correctamente. Estas consultas complejas son bastante difíciles (escribo consultas que pueden tener cientos de líneas de largo) sin la carga adicional de hacer un trabajo innecesario.
Está sujeto a causar errores de código. Si usa una base de datos que permite el uso de la unión natural (no creo que deba usarla alguna vez, pero cuando las características estén disponibles, alguien las usará), se unirá en lo incorrecto si obtiene un desarrollador que la use.
Si está copiando combinaciones para crear una consulta compleja, es fácil olvidarse de cambiar el alias al que desea y obtener una combinación incorrecta. Si cada identificación lleva el nombre de la tabla en la que se encuentra, generalmente obtendrá un error de sintaxis. También es más fácil detectar si la combinación en una consulta compleja es incorrecta si el nombre de pPK y el nombre de FK coinciden.
fuente
ID
no me convencen en absoluto.Hay algunas respuestas que se acercan a lo que yo consideraría la razón más importante para no usar "id" como el nombre de la columna para la clave primaria en una tabla: es decir, consistencia y reducción de la ambigüedad.
Sin embargo, para mí, el programador de mantenimiento obtiene el beneficio clave, en particular uno que no participó en el desarrollo original. Si usó el nombre "PersonID" para la ID en la tabla Person y usó ese nombre como una clave foránea, es trivial escribir una consulta en el esquema para averiguar qué tablas tienen PersonID sin tener que inferir ese "PersonID" es el nombre usado cuando es una clave foránea. Recuerde, correcto o incorrecto, las relaciones de claves externas no siempre se aplican en todos los proyectos.
Hay un caso extremo en el que una tabla puede necesitar tener dos claves externas para la misma tabla, pero en tales casos pondría el nombre de la clave original como el nombre del sufijo para la columna, por lo que una coincidencia de comodín,% PersonID, podría encontrar fácilmente esas instancias también.
Sí, gran parte de esto podría lograrse mediante un estándar de tener "id" y saber usarlo siempre como "tableNameID", pero eso requiere tanto saber que la práctica está en su lugar y depender de los desarrolladores originales para seguir adelante con un menor Práctica estándar intuitiva.
Si bien algunas personas han señalado que requiere algunos golpes de tecla adicionales para escribir los nombres de columna más largos, diría que escribir el código es solo una pequeña fracción de la vida activa del programa. Si el objetivo era guardar las pulsaciones de teclas del desarrollador, los comentarios nunca deberían escribirse.
Como alguien que ha pasado muchos años manteniendo proyectos grandes con cientos de tablas, preferiría nombres consistentes para una clave en todas las tablas.
fuente
Companies
tabla tiene 2 claves foráneas para unaPersons
tabla. Uno representa al presidente de la compañía; el otro representa al Tesorero de la compañía. ¿Realmente llamarías a las columnasPersonID1
yPersonID2
? Sería mucho más descriptivo llamarlosPresidentID
yTreasurerID
. Me resulta mucho más fácil de leerinner join Person AS Presidents ON Company.PresidentID = Presidents.ID
queinner join Person AS Person1 ON Company.PersonID1 = Person1.PersonID
CompanyOfficer
oCompanyPerson
tabla que permita una relación de muchos a muchos entreCompany
yPerson
con información adicional sobre la naturaleza de la relación. SiCompany
tuviera que implementarlo dentro de la tabla, usaría los nombres de columnaPresidentPersonID
yTreasurerPersonID
para preservar la parte * PersonID del nombre al agregar el descriptor adicional.inner join Person as Presidents on Company.PresidentPersonID = Presidents.PersonID
La práctica de usar Id como campo de clave principal conduce a la práctica donde se agrega id a cada tabla. Muchas tablas ya tienen información única que identifica de forma única un registro. Use ESO como clave principal y no como un campo de identificación que agregue a todas y cada una de las tablas. Esa es una de las bases de las bases de datos relacionales.
Y es por eso que usar id es una mala práctica: a menudo, id no es información, solo un aumento automático.
considere las siguientes tablas:
Lo que está mal con esta tabla es que permite al usuario agregar otra línea: Estados Unidos, con el código de país 840. Simplemente rompió la integridad relacional. Por supuesto, puede imponer la unicidad en columnas individuales, o simplemente puede usar una clave principal que ya está disponible:
De esa manera, utiliza la información que ya tiene como clave principal, que es el núcleo del diseño de la base de datos relacional.
fuente
Siempre uso 'id' como el nombre de columna principal para cada tabla simplemente porque es la convención de los marcos que uso (Ruby on Rails, CakePHP), por lo que no tengo que anularlo todo el tiempo.
Eso no superará las razones académicas para mí.
fuente
No creo que sea una mala práctica si se usa correctamente. Es común tener un campo de ID de incremento automático llamado "ID" que nunca tiene que tocar, y usar un identificador más amigable para la aplicación. Escribir un código puede ser un poco engorroso,
from tableA a inner join tableB b on a.id = b.a_id
pero ese código se puede guardar.Como preferencia personal, tiendo a prefijar el Id con el nombre de la entidad, pero no veo un problema real con solo usarlo
Id
si es manejado completamente por la base de datos.fuente
La identificación es lo suficientemente común, que no creo que pueda confundir a nadie. Siempre vas a querer saber la mesa. Poner nombres de campos en el código de producción sin incluir una tabla / alias es una mala práctica. Si está demasiado preocupado por poder escribir rápidamente consultas ad hoc, está solo.
Solo espero que nadie desarrolle una base de datos SQL donde ID sea una palabra reservada.
Se encarga del nombre del campo, la clave primaria y los incrementos automáticos en 1, comenzando con 1 todo en un pequeño y agradable paquete de 2 caracteres. Ah, y lo habría llamado CARS, pero si vamos a ahorrar en la pulsación de teclas y ¿quién cree realmente que una mesa llamada CAR solo tendrá uno?
fuente
Car
representa unTable
donde cada unoRow
representa un soloCar
. LlamarCars
cambia la semántica y muestra una completa falta de comprensión de los principios básicos de la teoría relacional formal. Rails es un excelente ejemplo de alguien que sabía lo suficiente como para ser peligroso .Esta pregunta ha sido superada una y otra vez, pero pensé que yo también agregaría mi opinión.
Utilizo id para significar que ese es el identificador de cada tabla, por lo que cuando me uno a una tabla y necesito la clave primaria, automáticamente me uno a la clave primaria.
El campo id es un incremento automático, sin signo (lo que significa que nunca tengo que establecer su valor y no puede ser negativo)
Para las claves externas, uso tablenameid (nuevamente una cuestión de estilo), pero la clave principal a la que me uno es el campo id de la tabla, por lo que la coherencia significa que siempre puedo verificar las consultas fácilmente
la identificación es corta y dulce también
Convención adicional: utilice minúsculas para todos los nombres de tablas y columnas, de modo que no se encuentren problemas debido a mayúsculas y minúsculas
fuente
Otra cosa a considerar es que si el nombre de la clave primaria es diferente del nombre de la clave externa, entonces no es posible usar ciertas herramientas de terceros.
Por ejemplo, no podría cargar su esquema en una herramienta como Visio y hacer que produzca ERD precisos.
fuente
Encuentro que la gente aquí cubre casi todos los aspectos, pero quiero agregar que "id" no es y no debe leerse como "identificador", es más un "índice" y seguramente no establece ni describe la identidad de la fila. (Es posible que haya utilizado una redacción incorrecta aquí, corríjame si lo hice)
Es más o menos cómo las personas leen los datos de la tabla y cómo escriben su código. Personalmente y muy probablemente esta es la forma más popular que veo con más frecuencia es que los codificadores escriben la referencia completa como
table.id
, incluso si no necesitan hacer uniones sindicales y / o unidas. Por ejemplo:De esa manera, puede traducirlo al inglés como "Dame el color y el modelo de ese auto numerado como". y no como "Dame el color y el modelo de ese auto identificado como número". La identificación no representa el automóvil de ninguna manera, es solo el índice del automóvil, un número de serie si lo desea. Justo como cuando quieres tomar el tercer elemento de una matriz.
Entonces, para resumir, lo que quería agregar es que es solo una cuestión de preferencia y la forma descrita de leer SQL es la más popular.
Sin embargo, hay algunos casos en los que esto no se usa, como (un ejemplo mucho más raro) cuando la ID es una cadena que realmente describe. Por ejemplo
id = "RedFordMustang1970"
o algo similar. Realmente espero poder explicar esto al menos para tener una idea.fuente