2009-07-30 28 views
15

¿Cuál es el punto (si existe) al tener una tabla en una base de datos con una sola fila?Tabla SQL con una sola fila?

Nota: No estoy hablando de la posibilidad de tener solo una fila en una tabla, pero cuando un desarrollador crea deliberadamente una tabla que siempre tiene exactamente una fila.

Editar:

El ejemplo impuesto sobre las ventas es una buena.

Acabo de observar en algún código que estoy revisando tres tablas diferentes que contienen tres tipos diferentes de certificados (a la SSL), cada uno con exactamente una fila. No entiendo por qué esto no está hecho en una mesa grande; Supongo que me estoy perdiendo algo.

+2

Si puede, ¿por qué no le pide al desarrollador una explicación en persona? – Juliet

+0

Además, ¿esto no conduce a un 'olor a programación'? Dado que no hay mecanismos en una base de datos que pueda usar para especificar una tabla con una sola fila, ¿sería posible colocar accidentalmente dos elementos en la tabla y usar datos incorrectos cuando los consulte más adelante? –

+0

@Jeremy: Puede abusar de los mecanismos en la mayoría de los RDBM para imponer un límite de 1 fila, como definir una columna de clave principal (o clave única) y luego también agregar una restricción de verificación en la misma columna que permite solo un valor. No es agradable, aunque –

Respuesta

10

He visto algo como esto cuando se le pidió a un desarrollador que creara una tabla de configuración para almacenar pares de nombre-valor de datos que deben mantenerse sin ser cambiados con frecuencia. Terminó creando una tabla de una fila con una columna para cada variable de configuración. No diría que es una buena idea, pero ciertamente puedo ver por qué el desarrollador lo hizo dadas sus instrucciones. Huelga decir que no pasó la revisión.

Acabo de observar en algún código que estoy revisando tres tablas diferentes que contienen tres tipos diferentes de certificados (a la SSL), cada uno con exactamente una fila. No entiendo por qué esto no está hecho en una fila; Supongo que me estoy perdiendo algo.

Esto no parece un buen diseño, a menos que haya algunos detalles importantes que usted no conozca. Si hay tres elementos de información que tienen las mismas restricciones, el mismo uso y la misma estructura, deben almacenarse en la misma tabla, el 99% del tiempo. Esa es una gran parte de lo que son las tablas fundamentalmente.

+0

Sí, esta fue mi impresión también, pero pensé que tal vez había algunas aceleraciones especiales para las tablas 'singleton' (singleton podría no ser la palabra correcta aquí, pero entiendes la idea) –

+0

Sin impulso que el índice agrupado derecho no no proporcionar – Welbog

+0

Welbog dada la limitación para su caso, ¿mencionó cuál sería la opción de buen diseño? –

2

A veces puede resultar útil emular algunas características que el sistema de la base de datos no proporciona. Estoy pensando en secuencias en MySQL, por ejemplo.

8

Para algunas cosas, solo necesita una fila, normalmente datos de configuración del sistema. Por ejemplo, "tasa de impuesto a las ventas actual". Esto podría cambiar en el futuro y, por lo tanto, no debería estar codificado, pero normalmente solo necesitará uno en un momento dado. Este tipo de datos debe estar en la base de datos para que las consultas puedan usarlo en los cálculos.

+1

¿Entonces tienes cada estado como una columna? ie: Seleccione California de CurrentSalesTaxRate? – NerdFury

+1

No soy un gran admirador de esto, por ejemplo aquí en Canadá, nuestro impuesto nacional a las ventas ha cambiado dos veces en los últimos 5 años, y las provinciales también están siendo cambiadas. Entonces, una tabla de impuestos a las ventas con una fecha de impuestos/tasa/vigencia/caducidad funciona mejor. –

+1

Depende de la aplicación. Por ejemplo, si necesita manejar tasas de impuesto a las ventas múltiples para diferentes estados, no estaría en una tabla de una sola fila; pero si está haciendo una aplicación de un solo país en Europa, por ejemplo, puede poner la tasa del impuesto al valor agregado en dicha tabla. –

6

No es necesariamente una mala idea.

¿Qué pasa si tiene algún estado global (por ejemplo, un booleano) que desea almacenar en alguna parte? ¿Y desea que sus procedimientos almacenados accedan fácilmente a este estado?

Puede crear una tabla con una clave principal cuyo rango de valores estuvo limitado a exactamente un valor.

0

A menos que haya restricciones de inserción en la tabla una marca de tiempo para el control de versiones, esto parece una mala idea.

1

¿Cuál es el punto (si existe) para tener una tabla en una base de datos con una sola fila?

Una base de datos relacional almacena cosas como relaciones: una serie de datos que satisfacen alguna relación.

Me gusta, este: "a VAT de este porcentaje está vigente en mi país ahora".

Si solo una tupla satisface esta relación, entonces sí, será la única en la tabla.

SQL no se puede almacenar variables: puede almacenar un conjunto que consta de 1 elemento, esto es una tabla de una fila.

También, SQL es un lenguaje basado en conjunto, y para algunas operaciones necesita un conjunto falso de una sola fila, como, para seleccionar una expresión constante.

No se puede simplemente SELECT de la nada en Oracle, necesita una cláusula FROM.

Oracle tiene un pseudotable, dual, que contiene una sola fila y una sola columna.

Una vez, hace mucho tiempo, que solía tener dos filas (de ahí el nombre dual), pero perdió su segunda fila en algún lugar de su camino a la versión 7.

MySQL tiene este pseudotable también, pero MySQL es capaz de hacer selects sin FROM cláusula. Aún así, es útil cuando se necesita un conjunto de filas vacías: SELECT 1 FROM dual WHERE NULL

yo sólo he observado en algún código que estoy revisando tres mesas diferentes que contienen tres tipos diferentes de certificados (a la SSL), cada uno con exactamente una fila. No entiendo por qué esto no está hecho en una mesa grande; Supongo que me estoy perdiendo algo.

Puede ser una especie de "tenerlo todo o perder" escenario, cuando se necesitan los tres certificados a la vez:

SELECT * 
FROM ssl1 
CROSS JOIN 
     ssl2 
CROSS JOIN 
     ssl3 

Si alguno si los certificados no se encuentra, toda la consulta no devuelve nada .

+0

Definitivamente no veo el patrón de combinación de coss aquí, pero ese es un buen punto. –

+0

@Jeremy: si no necesita ninguna otra condición a excepción de la mera presencia o la ausencia de una fila, 'CROSS JOIN' es lo que necesita. – Quassnoi

1

Una tabla con una sola fila se puede usar para almacenar configuraciones de nivel de aplicación que se comparten entre todos los usuarios de la base de datos. 'Usuarios máximos permitidos', por ejemplo.

0

Gracioso ... Me hice la misma pregunta. Si solo quiere almacenar un valor simple y su ÚNICO método de almacenamiento es un servidor SQL, eso es más o menos lo que tiene que hacer. Si tengo que hacer esto, generalmente termino creando una tabla con varias columnas y una fila. He visto un par de productos comerciales hacer esto también.

0

Hemos utilizado una sola fila de tablas en el pasado (no a menudo). En nuestro caso, esta tabla se usó para almacenar valores de configuración de todo el sistema que se podían actualizar a través de una interfaz web. Podríamos haber ido por la ruta de una tabla simple de nombre/valor, pero el cliente final prefirió una sola fila. Yo personalmente hubiera preferido lo último, pero realmente depende de la preferencia, especialmente si esta tabla nunca tendrá ningún tipo de relación con otra mesa.

+0

La tabla única probablemente era una mejor idea que una tabla de valores de nombre. Ugh me estremezco solo de pensar en alguien que use uno de esos si hay alguna alternativa, ya que pueden ser horribles para el rendimiento. – HLGEM

0

Si su base de datos es su aplicación, entonces probablemente tenga sentido almacenar los datos de configuración que puedan ser requeridos por los procedimientos almacenados que implementan la lógica de negocios.

Si tiene una aplicación que podría usar el sistema de archivos para almacenar información, entonces no creo que haya una ventaja al usar la base de datos en un archivo XML o plano, excepto que la mayoría de los desarrolladores ahora están mucho mejor versado en el uso de SQL para almacenar y recuperar datos en lugar de acceder al sistema de archivos.

0

Había una tabla configurada así en un proyecto que heredé. Fue para datos de configuración, y la razón que se dio fue que hizo consultas muy simples:

SELECT WidgetSize FROM ConfigTable 
SELECT FooLength FROM ConfigTable 

Bien, bien. Convertimos a una tabla de configuración generalizada:

ID Name IntValue StringValue TextValue 

Esto ha servido para nuestros propósitos.

0

Realmente no puedo entender por qué esta sería la mejor solución. Resulta más eficiente tener algún tipo de archivo de configuración que contendrá los datos que estarían en las tablas una fila. El costo de conectarse a la base de datos y consultar una fila sería más costoso. Sin embargo, si esto va a ser algún tipo de configuración para la lógica de la base de datos. Entonces esto tendría un poco más de sentido dependiendo del tipo de base de datos que esté utilizando.

1

uso el totalmente impresionante plugin-configuración de carriles para este http://github.com/Squeegy/rails-settings/tree/master

Es muy fácil de instalar y proporciona una agradable sintaxis:

Settings.admin_password = 'supersecret' 
    Settings.date_format = '%m %d, %Y' 
    Settings.cocktails  = ['Martini', 'Screwdriver', 'White Russian'] 
    Settings.foo   = 123 

desea una lista de todos los ajustes?

Settings.all   # returns {'admin_password' => 'super_secret', 'date_format' => '%m %d, %Y'} 

Establezca valores predeterminados para determinadas configuraciones de su aplicación. Esto causará que la configuración definida regrese con el valor especificado incluso si no están en la base de datos. Hacer un nuevo archivo en config/inicializadores/settings.rb con lo siguiente:

Settings.defaults[:some_setting] = 'footastic' 
+0

Hago exactamente lo mismo para la configuración en mi servidor sql db! =) – gideon

0
CREATE TABLE VERSION (VERSION_STRING VARCHAR2(20 BYTE)) 

?

0

Utilicé un único dato en una base de datos SQLite como contador en una página web dinámica. Esa es la forma más sencilla en que puedo pensar para que sea seguro para subprocesos (o sea, seguro para el proceso, para ser preciso). Pero no estoy seguro de si es una buena idea.

3

Una sola fila es como una clase singleton. propósito: controlar o administrar algún otro proceso.

mesa hilera podría actuar como una sección crítica o autómata determinista (tipo de despachador basado en valores de fila)

hilera es uso por completo en un COMPANY_DESCRIPTION mesa, para obtener datos consistentes sobre esa compañía. Úselo completo en las cartas y direcciones de la compañía.

Una sola fila se utiliza para contener un valor real como el IVA o la fecha o la hora, y así sucesivamente.

0

Creo que la mejor manera de lidiar con estos escenarios es usar el archivo de configuración (que generalmente es XML) en lugar de utilizar una base de datos, o crear su propio archivo de configuración que se lee durante el inicio de la aplicación . Solo toma unos minutos escribir el código para leer el archivo.

La ventaja aquí es que no hay posibilidad de agregar accidentalmente valores adicionales para la misma variable XML, y es excelente para las pruebas porque no es necesario escribir mucho código para probar las diferentes entradas, solo un simple cambie al valor de texto y vuelva a ejecutar la aplicación.

0

Un uso para esto podría ser almacenar la versión actual de la base de datos.

Si se almacenaran versiones de bases de datos para cambios de esquema, tendría que residir dentro de la base de datos.

Actualmente analizo el esquema y actualizo en consecuencia, pero estoy pensando en pasar al control de versiones. A menos que alguien tenga una mejor idea.

Uso vb.net y sql express

Cuestiones relacionadas