¿Por qué los prefijos de nombres de columnas se consideran una mala práctica?

25

Según una publicación SO popular, se considera una mala práctica prefijar los nombres de las tablas. En mi empresa, cada columna tiene como prefijo un nombre de tabla. Esto me es difícil de leer. No estoy seguro de la razón, pero este nombre es en realidad el estándar de la compañía. No soporto la convención de nomenclatura, pero no tengo documentación que respalde mi razonamiento.

Todo lo que sé es que leer AdventureWorks es mucho más simple. En esta base de datos de nuestra empresa, verá una tabla, Persona y puede tener el nombre de la columna:

Person_First_Name
o tal vez incluso
Person_Person_First_Name (no me preguntes por qué ves a la persona 2x)

¿Por qué se considera una mala práctica preestablecer los nombres de columna? ¿Los guiones bajos también se consideran malvados en SQL?


Nota: Soy propietario de Pro SQL Server 2008: diseño e implementación de la base de datos de relaciones. Las referencias a ese libro son bienvenidas.

P.Brian.Mackey
fuente
2
Parece que quién hizo estas reglas no estaba al tanto de la función de alias.
ba__friend
@Daniel Pryden: utilicé una redacción deficiente. Pregunta actualizada
P.Brian.Mackey
Un tipo similar de publicación aquí stackoverflow.com/questions/465136/…
@ba__friend - ¿Puedes darme algunos detalles sobre ese comentario?
P.Brian.Mackey
1
La palabra esencial que ha usado es Estándar. Si cambia una práctica estándar, tiene inconsistencia. ¿Honestamente siente que cualquier cambio de esta práctica estándar vale la inconsistencia resultante? ¿El status quo es realmente peor que eso?

Respuestas:

44

Los guiones bajos no son malos, solo son más difíciles de escribir. Lo malo es cambiar los estándares a mitad de camino sin arreglar todos los objetos existentes. Ahora tiene personId, Person_id, etc. y no puede recordar qué tabla usa los guiones bajos o no. La coherencia en la denominación (incluso si personalmente no le gustan los nombres) ayuda a facilitar la codificación.

Personalmente, el único lugar donde siento la necesidad de usar el nombre de la tabla en una columna es en la columna de ID (el uso de solo ID es un antipatrón en el diseño de la base de datos, ya que cualquiera que haya realizado extensas consultas de informes puede decírselo. Es muy divertido cambiar el nombre 12 columnas en su consulta cada vez que escribe un informe.) Eso también facilita el conocimiento inmediato de los FK en otras tablas, ya que tienen el mismo nombre.

Sin embargo, en una base de datos madura, es más trabajo de lo que vale la pena cambiar un estándar existente. Simplemente acepte que ese es el estándar y siga adelante, hay cosas mucho más críticas que deben arreglarse primero.

HLGEM
fuente
44
Es cierto, pero una base de datos sin un estándar de nomenclatura consistente es mucho más difícil de consultar que una con un estándar pobre que se aplica de manera consistente.
HLGEM
2
Estoy parcialmente de acuerdo Si la base de datos es ENORME, mantenga el estándar. Pero me paso el tiempo leyendo el código más que escribiéndolo y los prefijos de los nombres de las tablas parecen ser más ruidosos. Si fuera yo y supiera que podría refactorizarlo en unos días o una semana, lo haría. Pero muchas veces no tienes ese lujo y tienes que seguir codificando producción, producción, producción.
programador
3
@jason, puedes romper más de lo que piensas haciendo eso. Muchas veces se accede a las bases de datos por muchas cosas que el programador de la aplicación no conoce. Cosas como la importación de datos de clientes u otros dbs y las exportaciones a clientes y / o datawarehouses, otras aplicaciones, informes, etc. Puede acostumbrarse a leer cualquier estándar en cuestión de horas y refactorizar un estándar aprobado de la compañía sin un acuerdo para pasar a un nuevo estándar te despediría en la mayoría de los lugares. Honestamente, a menos que la base de datos esté en su infancia, es mejor usar el estándar existente, le guste o no.
HLGEM
77
@jason, soy una persona de base de datos, ¡somos ampliamente conocidos por no tener sentido de la aventura!
HLGEM
2
Totalmente de acuerdo con TableName.Id es un antipatrón. Han trabajado dentro y fuera de ese patrón de tiempo suficiente que puedo decir confidentelly errores / confusión ocurre con TableName.Id que no se producen con TableName.TableNameId
AaronLS
16

Un argumento para el prefijo de nombre de columna estaría evitando las "colisiones" de nombres al unir varias tablas Y cuando el creador de la consulta no usa alias.

SELECT person.name, company.name FROM person JOIN company ON ...

SELECT * FROM person JOIN company ON ...

Ambas consultas tendrían dos columnas de "nombre" ( nombre_1, nombre_2 ) sin "decir" a qué entidad pertenece. Y nunca puede estar seguro de los nombres de columna generados (será name_2 o name_3 o ...). Si usa el prefijo del nombre de la tabla, los nombres de las columnas serían person_name , company_name para que sepa cada nombre a qué entidad pertenece, además de que sabe que los nombres de las columnas permanecerán constantes (si los obtiene en Java usando JDBC, por ejemplo )

Se pueden ignorar ambos argumentos si se usa el alias, pero creo que la mayoría de las convenciones de codificación aplicadas en las empresas se deben a que muchos programadores (junior) no siguen las buenas prácticas. En este caso, por ejemplo, usar el comodín en una instrucción SELECT puede causar problemas sin el prefijo del nombre.

En cuanto al guión bajo en los nombres de tabla y columna, lo uso ampliamente porque solo uso minúsculas en los nombres más guión bajo como separador. Usar solo minúsculas ayuda a distinguir los identificadores de las palabras clave SQL (que escribo en mayúsculas):

SELECT person_name, COUNT(bought_product) FROM bought_products WHERE person_name LIKE 'A%'
Nicolae Albu
fuente
66
Me hubiera encantado que todas las columnas con la misma información en diferentes tablas hubieran tenido exactamente el mismo nombre y que cada vez que use más de 1 tabla de alias sea el estándar obligatorio. Cansarse bastante de recordar a qué tabla patid, patientid, pat_id, id_pat o ptatient_id asigna.
Pieter B
1
Nunca escribo una consulta de producción sin alias todas las columnas. Hace que el mantenimiento sea mucho más fácil. Por supuesto, escribo consultas complicadas de tipo informe / exportación con hasta 10-20 combinaciones y 30-50 columnas y seis meses después es difícil recordar de qué tabla proviene esa columna.
HLGEM
8

Agregar ese tipo de prefijos a los nombres de columna hará que una tabla sea más difícil de evolucionar. Como ejemplo: si finalmente se da cuenta de que desea / necesita cambiar el nombre de la tabla, deberá modificar toda la estructura de la tabla (es decir, no solo el nombre de la tabla, sino el nombre de todas sus columnas). Esto también dificultaría la actualización de los índices de la tabla y el código de los clientes que lo consultan.

Sergio
fuente
4

Hay excepciones si se usa juiciosamente (según la respuesta de Patrick Karcher en su enlace) para nombres de columnas comunes (normalmente solo ID, a veces Nombre) que serían ambiguos con demasiada frecuencia .

Otra práctica recomendada es calificar siempre las columnas y los objetos en sus consultas. Por lo tanto, los prefijos de columna se vuelven discutibles y abarrotan su código.

Compare estos: ¿cuál es más fácil para la vista?

SELECT P.name, P.Salary FROM dbo.Person P

SELECT Person.Name, Person.Salary FROM dbo.Person Person

SELECT dbo.Person.name, dbo.Person.Salary FROM dbo.Person

SELECT Person.Person_name, Person.Person_Salary FROM dbo.Person Person
gbn
fuente
3
Definitivamente el primero ... :)
ErikE
3
¿Qué hay de SELECT name, salary FROM dbo.Person? : P
cHao
1
@ cHao: intente crear una vista CON SCHEMABINDING sobre eso ...
gbn
@gbn: Funciona bien para mí. CREATE VIEW [dbo].[vwMeritPercentage] with schemabinding AS SELECT [Performance Score] as dblMinScore, ISNULL(( SELECT TOP 1 [Performance Score] FROM dbo.Budget b WHERE b.[Performance Score] > budget.[Performance Score] ORDER BY [Performance Score] ), 100.00) as dblMaxScore, [Merit Minimum] as dblMinPercentage, [Merit Midpoint] as dblBudgetPercentage, [Merit Maximum] as dblMaxPercentage FROM dbo.Budget;
cHao
1
Documentación relevante ( msdn.microsoft.com/en-us/library/ms187956(v=SQL.105).aspx ): "Cuando utiliza SCHEMABINDING, select_statement debe incluir los nombres de dos partes (schema.object) de las tablas, vistas o funciones definidas por el usuario a las que se hace referencia ". Tenga en cuenta que las columnas no requieren nombres punteados (a menos que sean necesarios para resolver ambigüedades en la consulta) ... solo tablas, vistas y funciones.
cHao
3

En general, realmente no parece haber ningún estándar omnipresente. La pregunta a la que se vinculó tiene varias respuestas altamente votadas con convenciones totalmente diferentes. Por supuesto, todos defenderán sus propios estándares, y es mucho más importante mantener convenciones consistentes en un proyecto.

Dicho esto, prefijar los nombres de las columnas parece ser excesivo. Ya sabe con qué tabla está trabajando, y una situación con dos columnas de diferentes tablas que tienen el mismo nombre puede resolverse fácilmente utilizando alias de tabla o columna.

Dan Simon
fuente
2

En TSQL puede referirse a los campos en el formato TableName.FieldName si desea evitar la ambigüedad, por lo que agregar nombres de tabla a los nombres de campo en realidad elimina la legibilidad, lo que lo convierte en TableName.TableName_FieldName o similar. Creo que usar guiones bajos o no es más una elección personal. Prefiero CamelCase y uso _ cuando quiero agregar un sufijo o similar, por ejemplo, TableName_Temp, pero solo soy yo.

Ben Robinson
fuente
2

Una vez trabajé en un sistema en el que decidimos usar códigos cortos para prefijar las columnas. Los campos PK usaban el "nombre completo de la tabla" como prefijo, y todas las demás columnas usaban de 2 a 4 caracteres consistentemente como prefijo. Cada columna también usó un dominio de datos como sufijo. Si se hace de manera consistente, puede ser muy agradable y limpio. No tiene sentido que un estándar de nomenclatura de un tipo u otro implique una codificación descuidada. La presencia de un estándar consistente es lo importante. He visto varias bases de datos que son inconsistentes porque no hay un estándar claro, y eso más que cualquier otra cosa me indicaría que puede haber problemas en las estructuras de datos. Si el diseñador de una base de datos ni siquiera puede nombrar constantemente objetos y sus hijos,

Tom
fuente
1

El prefijo es una mala práctica porque causa el problema que está diseñado para prevenir. Como dijiste, es muy difícil leer las columnas prefijadas. Si termina con nombres de columna duplicados en una consulta en la que une dos tablas, puede resolverlo, o es una vista, procedimiento almacenado o función tabular definida por el usuario que lo hace por usted si se encuentra constantemente uniendo tablas particulares.

En cuanto al uso subrayado en un nombre de tabla, ese es un argumento religioso. Al final, si aumenta la visibilidad y facilita las cosas. Generalmente, nunca tendría espacios o tablas en una columna o nombre de tabla. Sin embargo, podría hacer una excepción para las tablas o vistas que solo fueron utilizadas por un paquete de informes o exportadas a un archivo CSV.

Justin Dearing
fuente
1

Muchas bases de datos tienen límites estrictos en el número de caracteres en un nombre de columna (es decir, Oracle).

Si está trabajando con una base de datos que permite nombres de columna largos, pero luego decide que desea migrar esa estructura a otro sistema de base de datos, los prefijos aumentarán las posibilidades de que sus nombres de columna no sean válidos.

Aunque ahora está trabajando con SQL Server, nadie puede predecir el futuro, y es posible que su software tenga que funcionar en múltiples bases de datos en el futuro.

Britt Wescott
fuente
0

Considere escribir un diccionario de datos (o "registro"). Con eso quiero decir un documento que contiene todos los elementos de datos en su modelo: nombre, descripción, etc. Debe ser independiente de la implementación del modelo, por ejemplo, no debe mencionar los nombres de las tablas. ¿Cómo desagregaría nombres como 'ID', 'Tipo' y 'Código'?

Un enfoque es seguir las pautas de la norma internacional ISO / IEC 11179. Después de todo, ¿por qué reinventar la rueda? La estructura básica es:

[Object] [Qualifier] Property RepresentationTerm

con delimitadores entre los elementos: SQL no funciona bien con espacios en los nombres de columna y el subrayado funciona bien visualmente.

Tengo la sensación de que alguien en su organización estaba tratando de seguir estas pautas cuando se les ocurrieron nombres de elementos como Person_Person_First_Name.

El ejemplo que me gusta mostrar es el diccionario de datos del Servicio Nacional de Salud del Reino Unido (NHS) .

Así que no creo que la convención de nomenclatura con la que tienes que trabajar suene demasiado mal.

En la implementación, por ejemplo, en SQL, a algunas personas les gusta omitir los subelementos Objeto, Calificador y Propiedad cuando el nombre de la tabla proporciona contexto, por ejemplo, se person_first_nameconvierte first_nameen la Persontabla, etc. Sin embargo, la regla general de que un elemento de datos no debería cambiar su nombre simplemente debido a su ubicación en el modelo físico parece una buena. A cualquiera que piense que no es una buena idea seguir esta regla se le debe dar la tarea de documentar todas las variaciones de nombre que han usado :)

Encontrará un buen resumen de ISO 11179 en el libro Estilo de programación de Joe Celko , que incluye evidencia para preferir guiones bajos como delimitadores en los nombres de columna.

un día cuando
fuente
0

Algunos encuentran más fácil en el código saber de qué tabla provienen los datos, sin embargo, si está hablando de un sistema orientado a objetos, debe usar el contexto del nombre para saber de dónde proviene, en este caso el nombre de la tabla.

Personalmente, el prefijo de nombre de tabla es una indicación de que los desarrolladores no son muy hábiles y, a medida que profundice, encontrará muchas otras convenciones de codificación incorrecta y si tuviera que adivinar que la aplicación tiene demasiadas tablas, tiene errores, etc.

Bill Leeper
fuente