2009-06-04 20 views
90

¿Está bien tener una mesa con solo una columna? Sé que no es técnicamente ilegal, pero ¿se considera un diseño deficiente?¿Es una buena columna para una mesa de columna?

EDIT:

Aquí están algunos ejemplos:

  • Tiene una tabla con los 50 códigos estatales de Estados Unidos válidas, pero no tiene necesidad de almacenar los nombres de los estados detallados.
  • Una lista negra de correo electrónico.

Alguien mencionó la adición de un campo clave. De la forma en que lo veo, esta única columna SERÍA la clave principal.

+0

Tengo problemas para imaginar un caso de uso para una tabla con una sola columna. ¿Puede dar un ejemplo? –

+0

¿cuál es la única columna? –

+0

Sí, denos un ejemplo –

Respuesta

74

Sí, sin duda es un buen diseño diseñar una mesa de forma que sea más eficiente. El "Diseño de RDBMS malo" generalmente se centra en la ineficiencia.

Sin embargo, he encontrado que la mayoría de los casos de diseño de columna única podrían beneficiarse de una columna adicional. Por ejemplo, los códigos de estado generalmente pueden tener el nombre de estado completo escrito en una segunda columna.O una lista negra puede tener notas asociadas. Pero, si su diseño realmente no necesita esa información, entonces está perfectamente bien tener una sola columna.

1

Yo diría en general, sí. No estoy seguro de por qué necesita una sola columna. Hay algunas excepciones a esto que he visto usar de manera efectiva. Depende de lo que estás tratando de lograr.

No son realmente un buen diseño cuando se piensa en el esquema de la base de datos, pero en realidad solo se deben usar como tablas de utilidad.

He visto numbers tables usado con eficacia en el pasado.

1

El propósito de una base de datos es relacionar piezas de información entre sí. ¿Cómo puede hacer eso cuando no hay datos con los que relacionarse?

Quizás esto es algún tipo de tabla de compilación (es decir, Nombre + Apellido + Fecha de nacimiento), aunque todavía no estoy seguro de por qué querría hacer eso.

EDIT: pude ver el uso de este tipo de tabla para una lista simple de algún tipo. ¿Es para eso por lo que lo estás usando?

+8

No, el objetivo principal de una base de datos es almacenar información. –

+0

Pero una hoja de cálculo puede almacenar información. ¿Y cómo es útil la información si solo se trata de un grupo de números inconexos y letras sin correlación entre ellos? –

+0

La información puede ser útil porque la aplicación que utiliza la base de datos * la necesita * y no es un conjunto fijo. Es decir, el DB es simplemente el lugar más * conveniente * para colocar la información en una aplicación de base de datos: relacional o no. Estoy bastante seguro de que estarás de acuerdo en que no estamos creando aplicaciones para demostrar nuestra pureza con respecto al ideal relacional. En cambio, creamos aplicaciones para que sean útiles. –

25

Los he usado en el pasado. Un cliente mío quería bloquear automáticamente a cualquiera que intentase registrar con un número de teléfono en esta gran lista, así que era solo una gran lista negra.

14

Si existe una necesidad válida, entonces no veo ningún problema. Tal vez solo desee una lista de posibilidades para mostrar por algún motivo y desee poder cambiarla dinámicamente, pero no tiene necesidad de vincularla a otra tabla.

+0

+1 - En pocas palabras, esta es la respuesta correcta en mi libro –

+0

+1 para una respuesta concisa y clara. –

+3

¿Por qué no se puede vincular una tabla de una columna con otra tabla? – Aheho

-2

Sí, eso está perfectamente bien. pero un campo de ID no podría dañarlo ¿verdad?

+5

En realidad, puede. Cuando tiene una lista definitiva de valores válidos, lo último que desea es un campo ID porque implica que los valores no son únicos. Si 'LightBlue' es una clave, entonces no quieres que alguien piense que 'LightBlue' con id 1 podría ser diferente de 'LightBlue' con id 4. –

+0

¿Quién dice que Id debe ser identidad? ¿O parte de la llave? – Eric

+2

Podría ser una clave sintética y el campo original podría tener una restricción única en él. –

0

El único caso de uso que puedo concebir es una tabla de palabras tal vez para un juego de palabras. Accedes a la tabla solo para verificar que una cadena sea una palabra: selecciona palabras de palabras donde palabra =?. Pero hay estructuras de datos mucho mejores para mantener una lista de palabras que una base de datos relacional.

De lo contrario, los datos en una base de datos se colocan generalmente en una base de datos para aprovechar las relaciones entre los diversos atributos de los datos. Si sus datos no tienen atributos más allá de su valor, ¿cómo se desarrollará esta relación?

Por lo tanto, aunque no es ilegal, en general, probablemente no deba tener una tabla con solo una columna.

+0

Similar a esto es la tabla de números que es muy útil para detener el bucle. – u07ch

154

En términos de relational algebra esto sería una relación unaria, que significa "existe esta cosa "

Sí, está bien tener una tabla que define una relación tal: por ejemplo, para definir un dominio.

Los valores de dicha tabla deben ser claves naturales naturales, por supuesto.

Una tabla de búsqueda de prime numbers es lo primero que me viene a la mente.

+4

+1 Buena respuesta, Quassnoi. –

+3

+1: la tabla es un conjunto de valores que resultan ser tipos primitivos de su RDBMS. –

+4

+1 para proporcionar respuestas basadas en la teoría relacional. –

6

Habría casos poco comunes en los que una tabla de una sola columna tenga sentido. Hice una base de datos donde la lista de códigos de idioma válidos era una tabla de columna única utilizada como clave externa. No tenía sentido tener una clave diferente, ya que el código en sí era la clave. Y no había una descripción fija ya que las descripciones del código de idioma variarían según el idioma para algunos contextos.

En general, cualquier caso en el que necesite una lista autorizada de valores que no tengan ningún atributo adicional es un buen candidato para una tabla de una columna.

9

Uno de los casos que he encontrado a veces es algo como esto:

Tabla countries_id, contiene sólo una columna con el ID numérico de cada país.

Tabla countries_description, contiene la columna con ID de país, una columna con ID de idioma y una columna con el nombre de país localizado.

Tabla company_factories, contiene información para cada fábrica de la empresa, incluido el país en el que se encuentra.

Para mantener coherencia de datos y datos independientes del idioma en las tablas, la base de datos usa este esquema con tablas con una sola columna para permitir claves externas sin dependencias de idioma.

En este caso, creo que la existencia de tablas de una columna está justificada.

Editado en respuesta a la observación por: Quassnoi

http://lh5.ggpht.com/_7ON9I_WO6GU/SikFHBtzcxI/AAAAAAAAA-4/6MrVUCHGoWU/s800/taules.png

En este esquema puedo definir una clave externa en los company_factories de mesa que no me requieren para incluir la columna de idioma en la tabla, pero si no tengo la tabla countries_id, debo incluir la columna Idioma en la tabla para definir la clave externa.

+1

¿Por qué tener countries_id? Para insertar un país, necesita saber su nombre en al menos un idioma, y ​​esto dará como resultado que un country_id aparezca en countries_description. Una entrada country_id sin countries_description no tiene sentido. "El Sr. Barack Obama, presidente de COALESCE (14243, country_name) DEVOLUCIONES NULO VALOR, hoy se reunió con Dmitry Medvedev, presidente de Россия" – Quassnoi

+2

@Doliveras: OK, ahora veo, +1. Prefiero usar ISO 3166-1 para coutry_code, sin embargo. A diferencia de la identificación numérica, un código de país de 3 letras da una idea de qué país se menciona a casi todos en el mundo que pueden leer el alfabeto latino. – Quassnoi

+0

Aquí hay otra forma que he implementado para acomodar traducciones de lenguaje natural en la misma tabla. Por supuesto, muchos campos son anulables como resultado, pero puede descargar la integridad de los datos a activadores personalizados. CREATE TABLE "DBA". "MyLocalisedTable" ( \t "entry_id" INTEGER NOT AutoIncrement NULL DEFAULT, \t "master_entry_id" INTEGER NULL, \t VARCHAR (200) NULL "master_entry_label", \t "language_id" INTEGER NULL, \t "localised_entry_label" VARCHAR (300) NULL, –

1

Sí, siempre que el campo sea la clave principal como dijo que sería. La razón es porque si inserta datos duplicados, esas filas serán de solo lectura. Si intenta eliminar una de las filas que están duplicadas. no funcionará porque el servidor no sabrá qué fila eliminar.

+2

Eso es ridículo. Una operación de eliminación sin una clave principal o restricción eliminará todas las filas coincidentes, no las ignorará. –

+1

Por 'no funciona', podría significar que "no funciona como se esperaba" ", que cubre la condición" hey eliminé una fila, pero ambas se han ido. " – GWLlosa

+0

O, si intenta eliminar un registro en SSMS de la vista" Abrir tabla ", realmente arrojará un marcador y que el registro no se puede identificar de manera única y luego no hacer nada ... –

3

Utilizo tablas de columna única todo el tiempo, dependiendo, por supuesto, de si el diseño de la aplicación ya usa una base de datos. Una vez que he soportado la sobrecarga de diseño de establecer una conexión de base de datos, pongo todos los datos mutables en las tablas siempre que sea posible.

puedo pensar en dos usos de las tablas de una sola columna OTMH: existe

1) Elemento de datos. A menudo se usa en listas desplegables. También se usa para pruebas simples de legitimidad.

Por ejemplo. abreviaturas de estado de dos letras de EE. UU .; Códigos postales a los que enviamos; palabras legales en Scrabble; etc.

2) Atributo binario disperso, es decir, en una tabla grande, un atributo binario que será verdadero solo para unos pocos registros. En lugar de agregar una nueva columna booleana, podría crear una tabla separada que contenga las claves de los registros para los cuales el atributo es verdadero.

Por ejemplo. empleados que tienen una enfermedad terminal; bancos con un año de 360 ​​días (la mayoría usa 365); etc.

-Al.

4

No hay problema siempre que contenga valores únicos.

1

Lo he visto principalmente en las tablas de tipos de búsqueda, como la tabla de estado que ha descrito. Sin embargo, si hace esto, asegúrese de configurar la columna como la clave principal para forzar la exclusividad. Si no puede establecer este valor como único, entonces no debe usar una columna.

-1

Todas mis tablas tienen al menos cuatro campos de tecnología, clave primaria de serie, marcas de tiempo de creación y modificación, y booleano de eliminación suave. En cualquier lista negra, también querrá saber quién agregó la entrada. Entonces, para mí, la respuesta es no, una tabla con una sola columna no tendría sentido, excepto cuando se hace prototipo de algo.

+1

Parece que está mezclando una tabla de datos con una tabla de transacciones. En mi opinión, estas deberían ser dos cosas separadas. –

Cuestiones relacionadas