Recientemente, comencé a trabajar en algún sistema heredado. Las personas que lo desarrollaron tuvieron la idea de almacenar una lista de cadenas en un solo campo de la tabla de la base de datos. Digamos que es un identificador de objeto que no tiene ninguna representación ni datos en la base de datos. El rango de esos identificadores será relativamente pequeño en producción.
Por otro lado, mis intuiciones y el "buen gusto de diseño" me dicen que debería representarse en una tabla separada (similar a una tabla utilizada para representar relaciones de muchos a muchos).
¿Su enfoque es realmente malo y sería mejor comenzar una refactorización? En caso afirmativo, ¿qué malas consecuencias puede causar el diseño original en el futuro? ¿Hay algún principio de diseño relacional que explique ese enfoque?
Editar a la respuesta para comentarios:
Como supongo, no utilizaron este enfoque para resolver un problema específico como la estructura jerárquica de una manera complicada. El escenario más probable era el caso de que simplemente estaban trabajando bajo la presión del tiempo y necesitaban implementar nuevas características lo más rápido posible.
Estoy seguro de que anteriormente el campo representaba un valor único. Iban a implementar la función para almacenar más de un valor y trataron de evitar las migraciones de la base de datos.
Respuestas:
El modelo de datos no está normalizado; para ser así, necesitaría una tabla separada como usted dice. En ese sentido, no es una práctica particularmente buena de modelado de datos.
Si fue hecho por una buena razón o no es difícil de determinar. Posiblemente, la simplificación de la codificación o el rendimiento pueden haber sido motivadores. Como es probable, el campo originalmente contenía un identificador, los requisitos cambiaron y los desarrolladores no tuvieron tiempo ni ganas de re-factorizar.
Probablemente lo más importante es si debe refactorizarse o no. En circunstancias similares, no refactorizaría preventivamente un caso como este por defecto. Lo consideraría si se aplicara uno de los siguientes:
Lo que haría, y TBH, lo recomendaría siempre que se haga cargo de una aplicación heredada, es iniciar un wiki (o equivalente) y documentar casos como este. Por ejemplo,
Descubrí que este es un recordatorio útil para mí mientras trabajo y / o regreso a una base de código. También puede ser muy útil para su sucesor cuando, a su vez, deben comenzar a aprender la base de código.
fuente
Generalmente se consideraría una violación de la normalización.
Sin embargo, a veces esto se usa como una solución a un problema, por ejemplo, en la estructuración jerárquica, donde una cadena de ruta de longitud variable de algún tipo representa la estructura.
Entre los problemas con una lista de elementos en una sola cadena pueden estar:
fuente
Es un antipatrón común hacer esto.
Sus requisitos cambian y ahora necesita más valores en un lugar donde solía necesitar solo uno. Al igual que un libro tiene un solo autor ¿verdad? ¿Quién podría haber adivinado que un libro tiene múltiples autores? Esta es una manera fácil de cumplir con este cambio de requisitos sin tener que cambiar el esquema de su base de datos.
Sin embargo, hay algunos inconvenientes.
Básicamente, por favor no hagas esto.
Básicamente está sacando el "relacional" en la "base de datos relacional".
fuente
Ya hay muchos argumentos para que seamos una mala idea. Creo que sería justo agregar algunas razones por las cuales sería una buena, o al menos una buena idea. No estoy seguro de cuántos de estos se aplican en este caso específico, pero parece que al menos las observaciones de rendimiento realizadas son relevantes:
Al intentar una refactorización, siempre es una buena idea comprender primero la razón detrás de las elecciones de diseño anteriores. Asegúrese de que las condiciones y requisitos hayan cambiado lo suficiente como para garantizar el costo y el riesgo.
fuente