sql >> Base de Datos >  >> RDS >> Mysql

¿Cuál es su opinión sobre el uso de identificadores textuales en las columnas de la tabla cuando se acerca a la base de datos con la normalización y la escalabilidad en mente?

El primero está más normalizado, aunque un poco incompleto. Hay un par de enfoques que puede tomar, el más simple (y estrictamente hablando, el más 'correcto') necesitará dos tablas, con la restricción FK obvia.

commentid ---- subjectid ----- idType
--------------------------------------
1                22            post
2                26            photo
3                84            reply
4                36            post
5                22            status

idType
------
post
photo
reply
status

Si lo desea, puede usar un char(1) o similar para reducir el impacto del varchar en la longitud de la clave/índice, o para facilitar el uso con un ORM si planea usar uno. Los valores NULL siempre son una molestia, y si comienzas a verlos en tu diseño, será mejor que encuentres una manera conveniente de eliminarlos.

El segundo enfoque es el que prefiero cuando trato con más de 100 millones de filas:

commentid ---- subjectid
------------------------
1                22    
2                26     
3                84     
4                36     
5                22     

postIds ---- subjectid
----------------------
1                22   
4                36   

photoIds ---- subjectid
-----------------------
2                26    

replyIds ---- subjectid
-----------------------
3                84    

statusIds ---- subjectid
------------------------
5                22     

Por supuesto, también existe el enfoque híbrido (ligeramente desnormalizado), que utilizo mucho con grandes conjuntos de datos, ya que tienden a estar sucios. Simplemente proporcione las tablas de especialización para los idTypes predefinidos, pero mantenga una columna idType ad hoc en la tabla commentId.

Tenga en cuenta que incluso el enfoque híbrido solo requiere 2 veces el espacio de la tabla desnormalizada; y proporciona restricción de consulta trivial por idType. Sin embargo, la restricción de integridad no es directa, ya que es una restricción FK en una UNIÓN derivada de las tablas de tipos. Mi enfoque general es usar un activador en la tabla híbrida o una vista actualizable equivalente para propagar las actualizaciones a la tabla de subtipo correcta.

Tanto el enfoque simple como el enfoque de tabla de subtipo más complejo funcionan; aún así, para la mayoría de los propósitos se aplica KISS, así que sospecho que probablemente debería introducir una tabla ID_TYPES, el FK relevante, y terminar con eso.