2011-10-26 20 views
109

Así es como lo hago:¿Existe una convención de nombres para MySQL?

  1. nombres de tabla son minúsculas, utiliza guiones para separar las palabras, y son singulares (por ejemplo, 'foo', 'foo_bar', etc.
  2. por lo general (no siempre) tener un auto incremento PK. Yo uso la siguiente convención: tablename_id (por ejemplo, 'foo_id', 'foo_bar_id', etc.).
  3. Cuando una tabla contiene una columna que es una clave externa, solo copio el nombre de la columna de esa clave de cualquier tabla de la que proviene. Por ejemplo, supongamos que la tabla 'foo_bar' tiene el FK 'foo_id' (donde 'foo_id' es el PK de 'foo').
  4. Al definir FKs para enfo Respecto a la integridad referencial, uso lo siguiente: tablename_fk_columnname (p. avanzando el ejemplo 3, sería 'foo_bar_foo_id'). Como se trata de una combinación de nombre de tabla/nombre de columna, se garantiza que será único dentro de la base de datos.
  5. que ordenar las columnas como esta: PKs, FKS, a continuación, el resto de las columnas alfabéticamente

¿Hay una mejor manera, más estándar de hacer esto?

+3

¿Es incorrecto usar para incremento automático PK jus? t "id"? ¿Por qué? El nombre de la columna tiene significado solo en el contexto de la tabla. Entonces tengo una "identificación" en cada tabla, y puedo tener muchos id_ para FK. – Zbyszek

+1

@Zbyszek Creo que la razón más simple contra eso es simplemente por coherencia/simplicidad. En lugar de tener 'id_tableB' => * oh no * ** columna de nombre diferente **' id', la consistencia de 'id_tableB' =>' id_tableB' simplemente se ve más ordenada ... o como OP lo hace: 'foo_id' => 'foo_id' en lugar de' foo_id' => 'id' – mmcrae

Respuesta

77

Yo diría que ante todo: ser constante.

Creo que ya casi está llegando a las convenciones que ha descrito en su pregunta. Sin embargo, un par de comentarios:

Los puntos 1 y 2 son buenos, reconozco.

Punto 3: por desgracia, esto no siempre es posible. Piense en cómo manejaría una sola tabla foo_bar que tenga las columnas foo_id y another_foo_id, las cuales hacen referencia a la columna foo de la tabla foo_id. Es posible que desee considerar cómo lidiar con esto. Sin embargo, este es un poco un caso de esquina.

Punto 4 - Similar al punto 3. Es posible que desee introducir un número al final del nombre de la clave externa para tener más de una columna de referencia.

Punto 5 - Yo evitaría esto. Le proporciona poco y se convertirá en un dolor de cabeza cuando desee agregar o eliminar columnas de una tabla en una fecha posterior.

Algunos otros puntos son:

convenios Índice de nomenclatura de

Es posible que desee introducir una convención de nomenclatura para los índices - esto será una gran ayuda para cualquier trabajo de metadatos base de datos que es posible que desee realizar fuera. Por ejemplo, es posible que desee llamar a un índice foo_bar_idx1 o foo_idx1, depende de usted, pero vale la pena considerarlo.

Singular Plural de nombres de columnas vs

Podría ser una buena idea para hacer frente a la espinosa cuestión de plural vs solo en los nombres de las columnas, así como su nombre (s) de mesa. Este tema a menudo causa big debates en la comunidad DB. Me quedaría con formas singulares para los nombres y las columnas de la tabla. Ahí. Lo he dicho

¡Lo principal aquí es, por supuesto, la consistencia!

+0

¿Qué sería mejor que punto 5? ¿Por qué podría convertirse en un dolor de cabeza? – rsb2097

+4

Para hacer un seguimiento, encontré esta versión útil para aquellos que vendrán más tarde: https://launchbylunch.com/posts/2014/Feb/16/sql-naming-conventions/#naming-conventions – Enissay

+0

Estoy teniendo problemas encontrar un buen "esquema" para nombrar mis tablas que contienen objetos de modelos que constan de dos nombres (DocumentChapter, DocumentVersion, DocumentType, etc.). Por ejemplo, para DocumentType podría nombrarlo 'documenttype' o' document_type'. Preferiría el último, pero la mayoría de las veces tengo una relación de muchos a muchos y necesito una tabla que se parezca a 'document_document_type'. ¿Alguna sugerencia de cómo manejar esto? – lexith

5

Afortunadamente, los desarrolladores de PHP no son "fanáticos del caso Camel" como algunas comunidades de desarrollo que conozco.

Sus convenciones suenan bien.

Con tal de que ellos son a) simple, y b) consistente - no veo ningún problema :)

PS: personalmente, creo que 5) es una exageración ...

+1

Lejos de ser fanáticos, el caso camello es en realidad mal visto por muchos miembros de la comunidad DB porque algunos de los RDBMS 'no distinguen entre mayúsculas y minúsculas (o cambie todo a mayúsculas) para que las cosas se pongan realmente feas muy rápido. – mwan

+0

@mwan: ¿puede especificar qué RDBMS '? Y yo soy un jinete de camello. Las mayúsculas solo sirven para un propósito en mi esquema, para indicar tablas de unión y (en el caso de los campos) para indicar límites de palabras, de modo que _ puede ser exclusivamente para indicar un othertable_id (es decir, table name = othertable y field en esa tabla = id) Además, si el otro RDBMS no distingue entre mayúsculas y minúsculas, ¿qué importa realmente? ¡Nunca voy a tener una versión en mayúscula y minúscula de la misma tabla! Ah, y no preferiría un RDBMS insensible a las mayúsculas y minúsculas. Preferiría escribir el código consistente –

+2

Me gusta la ironía de los usuarios de MySQL que no les gusta CamelCase y el nombre del producto que usamos: MySQL, escrito en CamelCase – DBX12

14

La consistencia es la clave de cualquier estándar de nomenclatura. Mientras sea lógico y consistente, estás 99% allí.

El estándar en sí es una preferencia muy personal, por lo que si le gusta su estándar, entonces ejecute con él.

Para responder a su pregunta directamente, no, MySQL no tiene una convención de nomenclatura/estándar preferida, por lo que rodar la suya está bien (y la suya parece lógica).

Cuestiones relacionadas