Estoy comenzando un nuevo proyecto y me gustaría obtener mis nombres de tabla y columna desde el principio. Por ejemplo, siempre he usado el plural en los nombres de las tablas, pero recientemente aprendí que el singular es correcto.
Entonces, si obtuve una tabla "usuario" y luego obtuve productos que solo el usuario tendrá, ¿la tabla debería llamarse "usuario_producto" o simplemente "producto"? Esta es una relación de uno a muchos.
Y más adelante, si tuviera (por alguna razón) varias descripciones de productos para cada producto, ¿sería "user_product_description" o "product_description" o simplemente "description"? Por supuesto, con las claves foráneas correctas establecidas. Nombrar solo la descripción sería problemático ya que también podría tener una descripción de usuario o una descripción de cuenta o lo que sea ...
¿Qué pasa si quiero una tabla relacional pura (muchas a muchas) con solo dos columnas, ¿cómo sería? "user_stuff" o tal vez algo como "rel_user_stuff"? Y si el primero, ¿qué distinguiría esto de, por ejemplo, "user_product"?
Cualquier ayuda es muy apreciada y si hay algún tipo de convención de nomenclatura estándar que ustedes recomienden, no duden en vincular.
Gracias
primarily opinion-based
es evidentemente falso.Respuestas:
Nombre de la tabla
Si. Cuidado con los paganos. Plural en los nombres de las tablas. son un signo seguro de alguien que no ha leído ninguno de los materiales estándar y no tiene conocimiento de la teoría de bases de datos.
Algunas de las cosas maravillosas sobre los estándares son:
El nombre de la tabla estándar se refiere a cada fila de la tabla, que se usa en todos los verbos, no el contenido total de la tabla (sabemos que la
Customer
tabla contiene todos los Clientes).Relación, frase verbal
En las bases de datos relacionales genuinas que se han modelado (a diferencia de los sistemas de archivo de registros anteriores a 1970 [caracterizados porque
Record IDs
se implementan en un contenedor de base de datos SQL por conveniencia):Diagrama_A
Por supuesto, la relación se implementa en SQL como
CONSTRAINT FOREIGN KEY
en la tabla secundaria (más, más adelante). Aquí está la frase verbal (en el modelo), el predicado que representa (para leer del modelo) y el nombre de restricción FK :Tabla • Idioma
Sin embargo, cuando describa la tabla, particularmente en lenguaje técnico como los predicados u otra documentación, use el singular y el plural tal como están en el idioma inglés. Teniendo en cuenta que la tabla se nombra para la fila única (relación) y el lenguaje se refiere a cada fila derivada (relación derivada):
no
(Esa no es una pregunta de convención de nomenclatura; esa es una pregunta de diseño de db.) No importa si
user::product
es 1 :: n. Lo que importa es siproduct
es una entidad separada y si es una tabla independiente , es decir. Puede existir por sí mismo. Por lo tantoproduct
nouser_product
.Y si
product
existe solo en el contexto de unuser
, es decir. es una tabla dependiente , por lo tantouser_product
.Diagrama_B
Así es. De cualquier
user_product_description
XORproduct_description
será correcta, sobre la base de lo anterior. No es para diferenciarlo de otroxxxx_descriptions
, sino para darle al nombre una idea de dónde pertenece, siendo el prefijo la tabla principal.Afortunadamente, todas las tablas en la base de datos relacional son tablas puramente relacionales y normalizadas. No es necesario identificar eso en el nombre (de lo contrario, todas las tablas estarán
rel_something
).Si contiene solo las PK de los dos padres (que resuelve la relación lógica n :: n que no existe como entidad en el nivel lógico, en una tabla física ), esa es una Tabla asociativa . Sí, normalmente el nombre es una combinación de los dos nombres de la tabla principal.
Tenga en cuenta que en estos casos la Frase verbal se aplica y se lee de padres a padres, ignorando la tabla secundaria, porque su único propósito en la vida es relacionar a los dos padres.
Diagrama_C
Si es no una tabla asociativa (es decir., Además de los dos PKs, contiene datos), a continuación, nombre apropiadamente, y las frases verbales se aplican a la misma, no el padre al final de la relación.
Diagrama_D
Si termina con dos
user_product
tablas, es una señal muy fuerte de que no ha normalizado los datos. Así que retroceda unos pasos y haga eso, y nombre las tablas con precisión y coherencia. Los nombres se resolverán por sí mismos.Convenio de denominación
Lo que está haciendo es muy importante y afectará la facilidad de uso y comprensión en todos los niveles. Por lo tanto, es bueno obtener la mayor comprensión posible desde el principio. La relevancia de la mayoría de esto no será clara, hasta que comience a codificar en SQL.
El caso es el primer elemento a tratar. Todas las mayúsculas son inaceptables. El caso mixto es normal, especialmente si los usuarios pueden acceder directamente a las tablas. Consulte mis modelos de datos. Tenga en cuenta que cuando el buscador está utilizando un NonSQL demente, que solo tiene minúsculas, le doy eso, en cuyo caso incluyo guiones bajos (según sus ejemplos).
Mantener un enfoque de datos , no una aplicación o enfoque de uso. Es, después de todo 2011, hemos tenido Arquitectura Abierta desde 1984, y se supone que las bases de datos son independientes de las aplicaciones que las usan.
De esa manera, a medida que crecen, y más de lo que las usa una aplicación, los nombres seguirán siendo significativos y no necesitarán corrección. (Las bases de datos que están completamente integradas en una sola aplicación no son bases de datos). Nombra los elementos de datos solo como datos.
Sea muy considerado y nombre las tablas y columnas con mucha precisión . No lo use
UpdatedDate
si es unDATETIME
tipo de datos, úseloUpdatedDtm
. No lo use_description
si contiene una dosis.Es importante ser coherente en toda la base de datos. No lo use
NumProduct
en un lugar para indicar la cantidad de ProductosItemNo
niItemNum
en otro lugar para indicar la cantidad de Artículos. ÚseloNumSomething
para números de, y /SomethingNo
oSomethingId
para identificadores, consistentemente.No prefije el nombre de la columna con un nombre de tabla o código corto, como
user_first_name
. SQL ya proporciona el nombre de la tabla como calificador:Excepciones:
La primera excepción es para las PK, necesitan un manejo especial porque las codifica en combinaciones todo el tiempo y desea que las claves se destaquen de las columnas de datos. Siempre use
user_id
, nuncaid
.user_id
es la columna que identifica a un usuario, no el nombreid
deluser
tabla.user_product
tabla tendráuser_id
un componente de su PK(user_id, product_no)
.id
muchas tablas, es fácil confundirse en la codificación SQL. En segundo lugar, cualquier otra persona que el codificador inicial no tiene idea de lo que estaba tratando de hacer. Ambos son fáciles de evitar, si las columnas clave se tratan como anteriormente.La segunda excepción es cuando hay más de un FK que hace referencia a la misma tabla de la tabla principal, que se lleva en el elemento secundario. Según el modelo relacional , use nombres de roles para diferenciar el significado o uso, por ejemplo.
AssemblyCode
yComponentCode
para dosPartCodes
. Y en ese caso, no use el indiferenciadoPartCode
para uno de ellos. Se preciso.Diagrama_E
Prefijo
Cuando tenga más de 100 tablas, prefije los nombres de las tablas con un Área temática:
REF_
para tablas de referenciaOE_
para el clúster de entrada de pedidos, etc.Solo a nivel físico, no lógico (desordena el modelo).
Sufijo
Nunca use sufijos en las tablas, y siempre use sufijos en todo lo demás. Eso significa que en el uso lógico y normal de la base de datos, no hay guiones bajos; pero en el aspecto administrativo, los guiones bajos se usan como separador:
_V
Ver (con el principalTableName
al frente, por supuesto)_fk
Clave externa (el nombre de la restricción, no el nombre de la columna) Transacción de segmento de_cac
caché (proceso almacenado o función) Función (no transaccional), etc._seg
_tr
_fn
El formato es el nombre de la tabla o FK, un guión bajo y el nombre de la acción, un guión bajo y, finalmente, el sufijo.
Esto es realmente importante porque cuando el servidor te da un mensaje de error:
____
blah blah blah error on object_name
sabes exactamente qué objeto se violó y qué estaba tratando de hacer:
____
blah blah blah error on Customer_Add_tr
Claves foráneas (la restricción, no la columna). El mejor nombre para un FK es usar la frase verbal (menos el "cada" y la cardinalidad).
Customer_Initiates_SalesOrder_fk
Part_Comprises_Component_fk
Part_IsConsumedIn_Assembly_fk
Use la
Parent_Child_fk
secuencia, noChild_Parent_fk
es porque (a) se muestra en el orden correcto cuando los está buscando y (b) siempre conocemos al niño involucrado, lo que estamos adivinando es qué padre. El mensaje de error es entonces encantador:____
Foreign key violation on Vendor_Offers_PartVendor_fk
.Eso funciona bien para las personas que se molestan en modelar sus datos, donde se han identificado las frases verbales. Por lo demás, los sistemas de archivo de registro, etc, el uso
Parent_Child_fk
.Los índices son especiales, por lo que tienen una convención de nomenclatura propia, compuesta, en orden , por cada posición de personaje del 1 al 3:
U
Único, o_
para no únicoC
en clúster, o_
para no agrupado_
separadorPara el resto:
Si la clave es una columna o muy pocas columnas:
____
ColumnNames
Si la clave tiene más de unas pocas columnas:
____
PK
Clave primaria (según el modelo)____
AK[*n*]
Clave alternativa (término IDEF1X)Tenga en cuenta que el nombre de la tabla no es obligatorio en el nombre del índice, ya que siempre aparece como
table_name.index_name.
Entonces, cuando
Customer.UC_CustomerId
oProduct.U__AK
aparece en un mensaje de error, le dice algo significativo. Cuando observa los índices en una tabla, puede diferenciarlos fácilmente.Encuentre a alguien calificado y profesional y sígalos. Mire sus diseños y estudie cuidadosamente las convenciones de nombres que usan. Hágales preguntas específicas sobre cualquier cosa que no entienda. Por el contrario, huye de cualquiera que demuestre poco respeto por las convenciones o estándares de nombres. Aquí hay algunos para comenzar:
Ingreso de pedidos e inventario con direcciones que cumplen con los estándares
Sistema simple de boletines entre oficinas para PHP / MyNonSQL
Monitoreo de sensores con capacidad temporal completa
Respuestas a preguntas
Eso no se puede responder razonablemente en el espacio de comentarios.
Hay dos problemas principales en su comentario:
Declaras que tu ejemplo es "el más trivial", sin embargo, es todo lo contrario. Con ese tipo de contradicción, no estoy seguro de si usted es serio, si técnicamente capaz.
Esa especulación "trivial" tiene varios errores graves de normalización (diseño de base de datos).
Hasta que los corrija, no son naturales ni anormales, y no tienen ningún sentido. También podría nombrarlos anormal_1, anormal_2, etc.
Tienes "proveedores" que no suministran nada; referencias circulares (ilegales e innecesarias); clientes que compran productos sin ningún instrumento comercial (como Factura o Pedido de ventas) como base para la compra (¿o los clientes "poseen" productos?); relaciones de muchos a muchos sin resolver; etc.
Una vez que se normalice, y se identifiquen las tablas requeridas, sus nombres serán obvios. Naturalmente.
En cualquier caso, intentaré atender su consulta. Lo que significa que tendré que darle un poco de sentido, sin saber lo que querías decir, así que ten paciencia conmigo. Los errores graves son demasiados para enumerarlos, y dada la especificación adicional, no estoy seguro de haberlos corregido todos.
Asumiré que si el producto está compuesto de componentes, entonces el producto es un ensamblaje y los componentes se usan en más de un ensamblaje.
Además, dado que el "Proveedor vende componentes de cero a muchos", que no venden productos o ensamblajes, solo venden componentes.
Especulación vs modelo normalizado
En caso de que no lo sepa, la diferencia entre las esquinas cuadradas (Independiente) y las esquinas redondeadas (Dependiente) es significativa, consulte el enlace de notación IDEF1X. Del mismo modo, las líneas continuas (de identificación) frente a las líneas discontinuas (no identificables).
Ahora que he resuelto las tablas, no entiendo tu problema. Quizás puedas publicar una pregunta específica .
Asumiendo que no hay errores de Normalización,
User likes Product
es un predicado, no una tabla. No los confundas. Consulte mi Respuesta, donde se relaciona con Sujetos, Verbos y Predicados, y mi respuesta a Larry inmediatamente arriba.Cada tabla contiene un conjunto de hechos (cada fila es un hecho). Los predicados (o proposiciones) no son hechos, pueden o no ser ciertos.
El modelo relacional se basa en el cálculo de predicados de primer orden (más comúnmente conocido como lógica de primer orden). Un predicado es una oración de una sola cláusula en inglés simple y preciso, que se evalúa como verdadero o falso.
Además, cada tabla representa, o es la implementación de, muchos predicados, no uno.
Una consulta es una prueba de un predicado (o varios predicados, encadenados) que da como resultado verdadero (el hecho existe) o falso (el hecho no existe).
Por lo tanto, las tablas deben nombrarse, como se detalla en mi Respuesta (convenciones de nomenclatura), para la fila, el Hecho y los Predicados deben documentarse (por supuesto, es parte de la documentación de la base de datos), pero como una lista separada de Predicados .
Esto no es una sugerencia de que no son importantes. Son muy importantes, pero no escribiré eso aquí.
Rápidamente, entonces. Dado que el Modelo Relacional se basa en FOPC, se puede decir que toda la base de datos es un conjunto de declaraciones de FOPC, un conjunto de Predicados. Pero (a) hay muchos tipos de Predicados, y (b) una tabla no representa un Predicado (es la implementación física de muchos Predicados y de diferentes tipos de Predicados).
Por lo tanto, nombrar la tabla para "el" Predicar que "representa" es un concepto absurdo.
Los "teóricos" conocen solo unos pocos predicados, no entienden que desde que el RM se fundó en el FOL, toda la base de datos es un conjunto de predicados y de diferentes tipos.
Y, por supuesto, que elijan los absurdos de los pocos que sí saben:
EXISTING_PERSON
;PERSON_IS_CALLED
. Si no fuera tan triste, sería muy gracioso.Tenga en cuenta también que el nombre de la tabla estándar o atómica (nombrando la fila) funciona de manera brillante para todo el verborrea (incluidos todos los predicados adjuntos a la tabla). Por el contrario, el nombre idiota de "tabla representa predicado" no puede. Lo cual está bien para los "teóricos", que entienden muy poco acerca de los predicados, pero retrasados de lo contrario.
Los predicados que son relevantes para el modelo de datos, se expresan en el modelo, son de dos órdenes.
Predicado unario
El primer conjunto es esquemático , no texto: la notación en sí . Estos incluyen varios existenciales; Orientado a la restricción; y predicadores descriptores (atributos).
Predicado binario
El segundo conjunto son aquellos que forman relaciones entre hechos. Esta es la línea de relación. La frase verbal (detallada anteriormente) identifica el predicado, la proposición , que se ha implementado (que se puede probar mediante una consulta). Uno no puede ser más explícito que eso.
Aquí hay un modelo de datos , donde he enumerado los predicados. He elegido ese ejemplo porque muestra los predicados existenciales, etc., así como los de relación, los únicos predicados no enumerados son los descriptores. Aquí, debido al nivel de aprendizaje del buscador, lo estoy tratando como un usuario.
Por lo tanto, el evento de más de una tabla secundaria entre dos tablas primarias no es un problema, solo nómbrelas como el hecho existencial en relación con su contenido y normalice los nombres.
Aquí entran en juego las reglas que di para las frases verbales para nombres de relaciones para tablas asociativas. Aquí hay una discusión de Predicate vs Table , que cubre todos los puntos mencionados, en resumen.
Para una buena descripción breve sobre el uso adecuado de los predicados y cómo usarlos (que es un contexto bastante diferente al de responder a los comentarios aquí), visite esta respuesta y desplácese hacia abajo a la sección de predicados .
Ok, eso es lo que llamamos una tabla Key o NextKey. Nómbralo como tal. Si tiene SubjectAreas, use COM_NextKey para indicar que es común en la base de datos.
Por cierto, ese es un método muy pobre para generar claves. No es escalable en absoluto, pero luego, con el rendimiento de Oracle, probablemente esté "bien". Además, indica que su base de datos está llena de sustitutos, no relacionales en esas áreas. Lo que significa un rendimiento extremadamente pobre y falta de integridad.
fuente
Singular vs. Plural: elige uno y quédate con él.
Las columnas no deben tener el prefijo / sufijo / infijo o de todos modos fijados con referencias al hecho de que es una columna. Lo mismo vale para las mesas. No nombre las tablas EMPLOYEE_T o TBL_EMPLOYEES porque en el segundo que se reemplaza con una vista, las cosas se vuelven realmente confusas.
No inserte información de tipo en nombres, como "vc_firstname" para varchar o "flavour_enum". Tampoco incruste restricciones en los nombres de columna, como "department_fk" o "employee_pk".
En realidad, la única cosa buena acerca de las correcciones * se me ocurre, es que se puede utilizar como palabras reservadas
where_t
,tbl_order
,user_vw
. Por supuesto, en esos ejemplos, el uso del plural habría resuelto el problema :)No nombre todas las claves "ID". Las claves que se refieren a la misma cosa, deben tener el mismo nombre en todas las tablas. La columna de ID de usuario podría llamarse USER_ID en la tabla de usuario y todas las tablas que hacen referencia al usuario. El único momento en que cambia su nombre es cuando diferentes usuarios desempeñan diferentes roles, como Mensaje (sender_user_id, receptor_usuario_id). Esto realmente ayuda cuando se trata de consultas más grandes.
Con respecto a CaSe:
En general, es mejor nombrar "tablas de mapeo" para que coincidan con la relación que describe en lugar de los nombres de las tablas referenciadas. Un usuario puede tener cualquier número de relaciones con los productos
user_likes_product
,user_bought_product
,user_wants_to_buy_product
.fuente
{table_name}_id
lugar de soloid
, ya que a la columna solo se hará referencia con el nombre de la tabla prefijado como calificador, por ejemplotable_name.id
. Por contexto, estoy operando en un ecosistema donde la sintaxis de combinación del formulariotable_a JOIN table_b ON table_b_id_column
no es compatible; Que tengo que hacertable_a JOIN table_b ON table_b.id_column = table_a.table_b_id_column
.No hay "correcto" sobre singular versus plural: es principalmente una cuestión de gustos.
Depende en parte de tu enfoque. Si piensa en la tabla como una unidad, contiene 'plurales' (porque contiene muchas filas, por lo que un nombre plural es apropiado). Si piensa que el nombre de la tabla identifica una fila en una tabla, preferirá 'singular'. Esto significa que se considerará que su SQL funciona en una fila de la tabla. Eso está bien, aunque generalmente es una simplificación excesiva; SQL funciona en conjuntos (más o menos). Sin embargo, podemos ir con singular para las respuestas a esta pregunta.
Como probablemente necesitará una tabla 'usuario', otro 'producto' y el tercero para conectar a los usuarios con los productos, necesitará una tabla 'usuario_producto'.
Como la descripción se aplica a un producto, usaría 'product_description'. A menos que cada usuario nombre cada producto por sí mismo ...
La tabla 'user_product' es (o podría ser) un ejemplo de una tabla con un ID de producto y un ID de usuario y no mucho más. Nombra las tablas de dos atributos de la misma manera general: 'user_stuff'. Los prefijos decorativos como 'rel_' realmente no ayudan. Verá algunas personas usando 't_' delante de cada nombre de tabla, por ejemplo. Eso no es de mucha ayuda.
fuente
Los plurales no son malos siempre que se usen de manera consistente, pero el singular es mi preferencia.
Prescindiría de los guiones bajos a menos que desee esbozar una relación de muchos a muchos; y use un capital inicial porque ayuda a distinguir cosas en ORM.
Pero hay muchas convenciones de nomenclatura, por lo que si desea utilizar guiones bajos, está bien siempre que se haga de forma coherente.
Entonces:
Si solo un usuario puede tener algún producto, entonces
Pero si el producto es compartido por los usuarios:
Si guarda sus guiones bajos para las relaciones de muchos a muchos, puede hacer algo como:
para formar un M-to-M entre UserProduct y Stuff - no estoy seguro de la pregunta de la naturaleza exacta de los muchos a muchos requeridos.
fuente
No hay más correcto usar el singular que el plural, ¿dónde has escuchado eso? Prefiero decir que la forma plural es más común para nombrar tablas de bases de datos ... y, en mi opinión, también más lógica. La tabla suele contener más de una fila;) En un modelo conceptual, los nombres de las entidades suelen estar en singular.
Sobre su pregunta, si 'Producto' y 'Descripción del producto' son conceptos con una identidad (es decir, entidades) en su modelo, simplemente llamaría a las tablas 'Productos' y 'Descripción del producto'. Para las tablas que se usan para implementar una relación de muchos a muchos, a menudo uso la convención de nomenclatura "SideA2SideB", por ejemplo, "Student2Course".
fuente