2010-01-21 18 views
12

Cuando se trata del orden de las columnas en las tablas de bases de datos, ¿existen estándares o, al menos, mejores prácticas?Ordenar columnas en las tablas de la base de datos

Aquí es una convención hecha a mano que sigo:

  • clave primaria (es decir id);
  • columnas únicas (es decir, email, ssn);
  • claves externas (es decir, article);
  • columnas que contienen datos generados por el usuario (es decir, first_name, last_name);
  • columnas que contienen datos generados por el sistema;
    • no booleano (es decir, password_hash);
    • booleanos (es decir deleted, verified)
  • columnas marca de tiempo (es decir created_at);

Esto deja muchas preguntas sin contestar, por lo que me gustaría escuchar sus ideas.

+0

fin no debe ser importante en cualquier base de datos moderna que no sea para la organización legible por humanos –

+0

Mejores prácticas para nombres de columna son más importantes que en mi humilde opinión orden. Añado el sufijo "_PK" a mis claves principales y "_FK" a mis claves externas; recogió el hábito de otro tipo de base de datos. – Scott

Respuesta

6

En resumen, usted ha declarado bien las convenciones estándar y no le falta mucho. OMI, el único movimiento que haría que alguien parezca poco profesional sería no tener primero la clave principal. Tener las llaves extranjeras después de eso es una buena convención, pero no es un gran problema. (Clave principal de varios campos que incluyen las claves externas deben por supuesto estar en el mismo proceso de surgimiento, o alguien se deben golpeado.) Me gustaría añadir dos reflexiones adicionales:

  1. tienen campos con temas similares cerca uno del otro. Tener campos de Ciudad/Estado/Zip ampliamente separados sería inútil, por ejemplo. Creo que no importaría en absoluto si user_role o user_ip fueron los primeros, pero suenan como si estuvieran uno al lado del otro.
  2. Secundario a otras convenciones de este tipo, no hace daño que las cosas sean alfabéticas.

Tener convenciones adicionales dentro de su base de datos es una muy buena idea (como la que siempre hablar de tener la marca de tiempo al final). Si tiene campos ChangeDate y ChangeBy en muchas de sus tablas, tenerlos (uno al lado del otro y uno regularmente) es bueno.

Además, ErikE mencionó que puede haber cierta eficiencia para tener, al final de la tabla, los campos de longitud variable (varchar, nvarchar) que a menudo pueden contener nulos. Aparte de eso, no creo que haya ventajas de rendimiento para organizar las cosas de cierta manera en las bases de datos relacionales modernas.

Naming

A menudo, cuando usted está decidiendo orden de las columnas es al mismo tiempo vaya a decidir sobre los nombres de las columnas, así que me gustaría para hacer frente a eso un poco. Ciertamente puede cometer errores terribles y costosos con el nombrando de sus campos; esto es mucho más importante que el orden de sus columnas.El pedido puede cambiarse fácilmente, pero los nombres pobres le causarán problemas para siempre. Es un gran dolor cambiar los nombres de tabla/columna un año después, cuando hay una docena de referencias a ellos. Acabo de agregar una respuesta here para abordar este tema tan importante.

+0

Llamo mis tablas "algo" (plural) y mi clave principal "algo" (singular). –

+0

Sí, perfecto. Customers.CustomerID. Trabajé con alguien que prefijaba tablas de datos estándar con * tbl *, y tenía algunos otros prefijos. Bien hecho, creo que está bien, pero no es necesario. –

+0

nouI verThink nouPrefixes verAre adjmuch adjWorse conThan nouNot adjNecessary. Creo que son descuidados y saturan la base de datos de una manera dañina. – ErikE

-1

puedes encontrar diferentes mejores prácticas en toda la red.

Guardar siempre CREATE TABLE, junto con todas las demás declaraciones que definen esquema de base en un lugar seguro. Cada vez que realice un cambio en un objeto de base de datos, asegúrese de escribir el cambio y verificarlo en software de control de versiones, como Visual Source Safe.

Con esta política puede fácilmente volver a crear el esquema de la base de datos en el mismo o servidor diferente, si es necesario. Además, si tiene la misma base de datos en los servidores múltiples , es fácil comparar los esquemas y reconciliar cualquier diferencia que pueda haberse arrastrado con el tiempo.

Aunque descriptivo, los nombres de tabla tienen sin beneficios de rendimiento. Hacen que las bases de datos sean autodocumentadas y más fáciles de codificar . Los nombres de tablas deben reflejar el significado comercial.

Crear tablas de usuario en un grupo de archivos no primario ; reserve el archivo primario grupo para objetos del sistema. De esta forma, el sistema suministrado y los objetos definidos por el usuario no compiten por los recursos de disco .

Crear tablas de acceso común en el mismo grupo de archivos . Puede esperar beneficios de rendimiento de si los datos de tablas unidas comúnmente residen en el mismo disco .

Cree un índice agrupado en cada tabla . Cada tabla solo puede tener un índice agrupado único . Si una tabla tiene un índice agrupado, sus datos son clasificados físicamente según la clave de índice agrupado . Los índices agrupados en SQL Server tienen numerosos beneficios. Por ejemplo, si recupera datos de una tabla con una cláusula ORDER BY que hace referencia a la clave de índice agrupado, , no es necesario ordenar los datos en tiempo de ejecución de consultas.

Si dos tablas tienen una columna común, por ejemplo customer_id, y ambas tablas han agrupado los índices en la columna customer_id de unión, tales tablas será considerablemente más eficiente que unirse a las mismas tablas basado en la misma columna pero sin índices agrupados.

Asegúrese de que el índice agrupado se basa en una columna que contiene distinta

Fuente: Creating SQL Server tables: A best practices guide

+1

Cualquier base de datos que valga la pena generará el esquema existente como texto ... al menos lo hacen postgres, mysql, ms-sql y oracle. –

+0

abajo voto para recomendar Visual SourceSafe para cualquier cosa, sobre todo en 2010 –

+0

piruleta @fuzzy: ¿Qué recomienda usted en su lugar? Estoy buscando algo que se integra con las bases de datos de SQL Server (idealmente con un estudio de gestión de plug-in) – ErikE

6

En MSSQL Server, columnas nulo al final de la lista de columnas en realidad reducen el espacio necesario para almacenar esa fila, que puede aumentar el número de filas por página, lo que puede reducir el número de lecturas requeridas por operación de E/S, que es un beneficio de rendimiento. Si bien el beneficio de rendimiento puede no ser enorme, es algo a tener en cuenta para cualquier columna que tenga una preponderancia de valores NULL.

Prueba de arrastre NULL reduciendo el espacio de almacenamiento se puede tener en Deciphering a SQL Server data page:

... El mapa de bits nula es ligeramente diferente (Fe/1111 1110), ya que es ahora la segunda columna que es nulo. Lo que es interesante es que en esta fila, sólo se una sola columna de longitud variable es presente, no dos. Por lo tanto no hay finalizará sólo una columna sola longitud variable identificador de índice, 0D00/0x000D/13. Desde que podemos concluir que las columnas se manejan en orden, y por lo tanto uno podríamos desear considerar el orden de columnas, si una columna específica es generalmente nula, podría ser más eficiente tener ordenó el pasado.

Tenga en cuenta que esto solo se aplica a las columnas de longitud variable. Si bien eso incluye claramente varchar, varbinary, etc., no estoy seguro acerca de otros tipos de datos (y no tengo tiempo en este momento para determinar esto de manera concluyente).

+0

+1 porque no tenía ni idea de esto! – ahsteele

+0

+1 Yo tampoco. –

1

En MS SQL Server, los tipos de datos ntext, imagen y texto (todas recientemente desuso) debe ser el último en la fila de columnas para evitar una penalización de rendimiento.

Cuestiones relacionadas