Sí, es una idea terrible.
En lugar de ir:
SELECT Deal.Name, DealCategory.Name
FROM Deal
INNER JOIN
DealCategories ON Deal.DealID = DealCategories.DealID
INNER JOIN
DealCategory ON DealCategories.DealCategoryID = DealCategory.DealCategoryID
WHERE Deal.DealID = 1234
Ahora tienes que ir:
SELECT Deal.ID, Deal.Name, DealCategories
FROM Deal
WHERE Deal.DealID = 1234
Luego debe hacer cosas en el código de su aplicación para dividir esa lista de comas en números individuales, luego consultar la base de datos por separado:
SELECT DealCategory.Name
FROM DealCategory
WHERE DealCategory.DealCategoryID IN (<<that list from before>>)
Este diseño antipatrón se debe a un malentendido completo del modelado relacional (no tiene que tener miedo a las tablas. Las tablas son sus amigos. Úselos), o una creencia extrañamente equivocada de que es más rápido tomar una lista separada por comas y dividirla en el código de la aplicación de lo que es agregar una tabla de enlaces ( nunca lo es). La tercera opción es que no son lo suficientemente seguros / competentes con SQL para poder configurar claves externas, pero si ese es el caso, no deberían tener nada que ver con el diseño de un modelo relacional.
SQL Antipatterns (Karwin, 2010) dedica un capítulo entero a este antipatrón (que él llama 'Jaywalking'), páginas 15-23. Además, el autor ha publicado una pregunta similar en SO . Los puntos clave que observa (como se aplican a este ejemplo) son:
- La consulta de todas las ofertas en una categoría específica es bastante complicada (la forma más fácil de resolver ese problema es una expresión regular, pero una expresión regular es un problema en sí misma).
- No puede imponer integridad referencial sin relaciones de claves externas. Si elimina DealCategory nr. # 26, entonces, en el código de su aplicación, tiene que pasar por cada acuerdo buscando referencias a la categoría # 26 y eliminarlas. Esto es algo que debe manejarse en la capa de datos, y tener que manejarlo en su aplicación es algo muy malo .
- Las consultas agregadas (
COUNT
, SUM
etc.), nuevamente, varían de 'complicadas' a 'casi imposibles'. Pregúnteles a sus desarrolladores cómo podrían obtener una lista de todas las categorías con un recuento del número de ofertas en esa categoría. Con un diseño adecuado, son cuatro líneas de SQL.
- Las actualizaciones se vuelven mucho más difíciles (es decir, tiene un acuerdo que está en cinco categorías, pero desea eliminar dos y agregar otras tres). Son tres líneas de SQL con un diseño adecuado.
- Eventualmente te toparás con
VARCHAR
limitaciones de longitud de lista. Aunque si tienes una lista separada por comas que tiene más de 4000 caracteres, lo más probable es que el monstruo sea lento como el infierno de todos modos.
- Sacar una lista de la base de datos, dividirla y luego volver a la base de datos para otra consulta es intrínsecamente más lenta que una consulta.
TLDR: es un diseño fundamentalmente defectuoso, no se escalará bien, introduce una complejidad adicional incluso para las consultas más simples, y de forma inmediata ralentiza su aplicación.