Estoy trabajando en el diseño de una base de datos que se utilizará para almacenar datos que provienen de una serie de fuentes diferentes. Las instancias que estoy almacenando tienen identificadores únicos asignados por las fuentes originales. Cada instancia que almaceno debe contener información sobre la fuente de donde proviene, junto con la ID a la que estuvo asociada esta fuente.clave primaria compuesta
Como ejemplo, considere la siguiente tabla que ilustra el problema:
----------------------------------------------------------------
| source_id | id_on_source | data |
----------------------------------------------------------------
| 1 | 17600 | ... |
| 1 | 17601 | ... |
| 2 | 1 | ... |
| 3 | 1 | ... |
----------------------------------------------------------------
Tenga en cuenta que mientras que el id_on_source
es único para cada fuente, es posible que el mismo id_on_source
a encontrar por diferentes fuentes.
Tengo una comprensión decente de las bases de datos relacionales, pero estoy lejos de ser un experto o incluso un usuario experimentado. El problema que enfrento con este diseño es lo que debería usar como clave principal. Los datos parecen dictar el uso de una clave primaria compuesta de (source_id, id_on_source)
. Después de un poco de google encontré algunos acalorados debates sobre los pros y los contras de las claves primarias compuestas, sin embargo, dejándome un poco confundido.
La tabla tendrá una relación uno a muchos con otras tablas, y así se hará referencia en las claves externas de otras tablas.
yo no estoy atado a una específica RDBMS
y no estoy seguro si importa por el bien del argumento, pero digamos que prefiero trabajar con SQLite
y MySQL
.
¿Cuáles son los pros y los contras de utilizar una clave foránea compuesta en este caso? ¿Cual preferirías?
Piensa en un PK compuesto para almacenar Era y Timestamp (1, 1970 ~ 2106) (2, 2106 ~ 2242). Debido a que INT8, INT16, INT32, INT64 son binarios y basados en bits, entonces no tenemos el tamaño INT adecuado para el año 9999. INT no es suficiente y BIG INT es demasiado grande. – Alix