Tabla sola vs Dos tablas relacionadas con uno a uno -- sql campo con database campo con database-design campo con relational-database camp Relacionados El problema

Single table vs two one-to-one related tables performance


1
vote

problema

Español

Asumamos que queremos almacenar los siguientes datos en la base de datos relacionales: CountryName , CapitalCityName , CapitalCityPostCode . Supongamos que una ciudad tiene solo un código postal . Podemos implementarlo en una tabla de una manera trivial:

  Countries [PK]CountryId, CountryName, CapitalCityName, CapitalCityPostCode   

O podemos organizarlo de la manera más normalizada en 2 tablas en 1: 1 Relación:

   Coutries    [PK]CountryId, CountryName, [FK]CapitalCityId   

y

   CapitalCities  [PK]CapitalCityId, CapitalCityName, CapitalCityPostCode, [FK]CountryId   

¿Cómo afectará esto al rendimiento? Por ejemplo, si necesitamos enumerar a todos los países con sus nombres de capitales, ¿será significativamente más rápido en el primer caso? ¿Cuántos registros / columnas necesito para tener que ver la diferencia?

Original en ingles

Let's assume we want to store following data in the relational database: CountryName, CapitalCityName, CapitalCityPostCode. Lets assume that one city has only one post code. We can implement it in one table in a trivial way:

Countries [PK]CountryId, CountryName, CapitalCityName, CapitalCityPostCode 

Or we can arrange it in the more normalized way into 2 tables in 1:1 relation:

 Coutries    [PK]CountryId, CountryName, [FK]CapitalCityId 

and

 CapitalCities  [PK]CapitalCityId, CapitalCityName, CapitalCityPostCode, [FK]CountryId 

How will this affect the performance? For example - if we need to list all the countries with its capitals names, will it be significantly faster in the first case? How many records/columns do I need to have to see the difference?

           
       
       

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Obviamente, puedes ver el 1er no es el 3er forma normal. El rendimiento sabio Una tabla correctamente normalizada estará a la par a una mesa plana como lo tiene en el primer ejemplo, incluso cuando se trata de 10s y 100s de millones de registros. Aunque el archivo plano siempre será un poco más rápido, pero en cantidades triviales si se relacionan correctamente. El problema con el primero se convierte en escalabilidad a lo largo del tiempo. Usted está renunciando a una ligera ganancia en el rendimiento para una base inestable si se necesita un crecimiento

Es una diferencia marginal en el mejor de los casos. La única mesa siempre tendrá una ligera ventaja; Lo que se volvería más pronunciado cuando seas tratando con cientos de millones de registros +. Pero hay formas de evitar eso al particionar la tabla en bloques relevantes, por lo que el motor puede recortar múltiples los resultados que recopilan y eliminan muchos registros innecesarios basados ​​en unirse y amplificador; criterios de filtro.

Como dentro de cualquier otro desarrollo, no hay una sola bala de plata. Siempre hay excepciones a las reglas; El contexto importa para cada pregunta. Sin embargo, el enfoque de cepillo ancho dice, normalizarse a menos que sepa que nunca habrá crecimiento. (¡Nunca es mucho tiempo! Pero entonces tal vez el sistema tiene una vida útil conocida y nunca logrará una existencia a largo plazo).

 

Obviously you can see the 1st isn't 3rd normal form. Performance wise a properly normalized table will be on par to a flat table as you have in the first example even when dealing with 10s and 100s of millions of records. Though the flat file will always be slightly faster but at trivial amounts if properly related. The issue with the first becomes scalability over time. You're giving up a slight gain in performance for an unstable foundation if growth is needed

It's a Marginal difference at best. The single table will always have a slight advantage; which would become more pronounced when you're dealing with hundreds of millions of records+. But there's ways around that by partitioning the table into relevant blocks so the engine can multi-thread the results gathering and eliminate lots of unneeded records based on join & filter criteria.

As within any other development there is no one single silver bullet. There are always exceptions to the rules; context matters for each question. However, the broad brush approach says, normalize unless you KNOW there will NEVER be growth. (never's a long time! but then maybe the system has a known shelf life and will never achieve such long term existence. )

 
 
2
 
vote

En el ejemplo anterior, con tablas para país y capital, la normalización no es muy útil. La relación única a una no causa ninguna duplicación o complicaciones en la lectura y la actualización de los datos. Sería útil en caso de datos que necesitan tablas como país y ciudad con un país que tenga capital como FK de la ciudad. La lectura de dos tablas requiere una unión que definitivamente es más lenta (no por un gran margen) que leer desde una sola mesa. Con varios cientos de registros, la diferencia vista sería de 10 a 15 ms.

 

In the above example, with tables for Country and CapitalCities, normalization is not very helpful. The one to one relationship doesn't cause any duplicacy or complications in reading and updating data. It would be helpful in case of data that need tables like Country and City with Country having capital city as fk of City. Reading from two tables require a join which is definitely slower(not by a great margin) than reading from a single table. With several hundreds of record the difference seen would be of 10 to 15 ms.

 
 
0
 
vote

En general, si hay una correspondencia uno a uno, entonces no hay ninguna ventaja para dividir los datos en dos tablas. No está "normalizando" los datos si no hay redundancia. Simplemente especifique que la columna CapitalCityName se indexa si necesita buscar por ciudad. Aún obtendrá el rendimiento de la búsqueda y eliminará la sobrecarga de tener que unirse a dos tablas para la consulta.

Por otro lado, si hay muchos códigos postales para cada ciudad (muy común), entonces se requeriría una tabla separada para normalizar los datos y proporcionar una lista de códigos postales para cada ciudad (o la ciudad para un específico código postal). Pero eso trae un nuevo problema: los códigos postales pueden no ser únicos: el mismo código podría repetirse en más de un país, o incluso hay situaciones en las que "Ciudades gemelas" comparten un código postal común. Pero eso es un problema para otra discusión.

 

In general, if there is a one-to-one correspondence, then there's no advantage to splitting the data into two tables. You are not "normalizing" the data if there is no redundancy. Simply specify that the CapitalCityName column is indexed if you need to search by city. You will still get the search performance and remove the overhead of having to join two tables for the query.

On the other hand, if there are many postal codes for each city (very common), then a separate table would be required to normalize the data and provide a list of postal codes for each city (or the city for a specific postal code). But that brings in a new issue: The postal codes may not be unique: the same code might be repeated in more than one country, or there is even situations where "twin cities" share a common postal code. But that's an issue for another discussion.

 
 
     
     

Relacionados problema

0  Asesoramiento de diseño de la base de datos: múltiples preguntas de sí o no  ( Database design advice multiple yes or no questions ) 
I HAM Actualmente diseñando una tabla de base de datos y el formulario VB que va con él. El formulario le preguntará a las 40 preguntas predefinidas Sí / No a...

-1  Cómo está el uso y la palabra clave diferente al usar "Joins" [explícitamente] en SQL [Duplicar]  ( How is using and keyword different from using joins explicitly in sql ) 
Esta pregunta ya tiene respuestas aquí : Unirse interno en VS donde la cláusula ...

1  ¿Hay formularios canónicos para consultas de la base de datos?  ( Are there canonical forms for database queries ) 
Di que quiero hacer un "generador de consulta optimizado". Básicamente, un optimizador de consultas SQL que es mucho mejor de lo que se puede colocar en un se...

0  MySQL selecciona uno de los dos campos donde uno de ellos iguala un valor  ( Mysql select one of two fields where one of them equal a value ) 
Tengo dos tablas "Usuarios" y "Relaciones", quiero seleccionar las relaciones de todos los usuarios. table relations user1 user2 1 2 1 3 5 1 ...

0  Cómo obtener todas las subcategorías de la base de datos en Java  ( How to get all sub categories from database in java ) 
Estoy teniendo una estructura tipo árbol en mi base de datos como a continuación. mysql> select * from categories; +----+---------------+-----------+ | id ...

6  Campamento relacional y desarrollo de bases de datos "del mundo real"  ( Relational camp and real world database development ) 
Pasado más de una década desde la primera publicación de la fecha de la fecha y Darwen's "el tercer manifiesto" en 1995. ¿Cuál es el lugar de la escuela d...

1  ¿Las mesas de unión tienen más de una claves principales de otra tabla de identificación?  ( Should junction tables have more than one primary keys from another identifying ) 
Aquí hay un ejemplo: Originalmente tengo 3 mesas. Tabla B Referencias Tabla A. Así que ahora la Tabla B tiene dos claves principales. Uno se usa como la clave...

1  Convertir una ontología del búho en una base de datos relacional  ( Convert an owl ontology into a relational database ) 
¿Hay alguna herramienta para obtener rápidamente una base de datos relacional de una ontología del búho? ...

1  ¿Cómo tratamos una columna que tiene el mismo valor en todos los registros de una tabla?  ( How do we treat a column that has the same value across all records of a table ) 
Supongamos que tengo una tabla y para simplificar las cosas todas las filas son sobre Persons y asumamos que almacenamos el color de la persona. Ahora vamos...

2  Bloqueo de la base de datos  ( Locking the database ) 
Hola, estoy tratando de ver qué está bloqueando la base de datos y encontramos 2 tipos de bloqueo. Bloqueo optimista y pesimista. ¡Encontré algunos artículos ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos