Esquema propuesto
En primer lugar, aquí hay un ejemplo de mi esquema propuesto para hacer referencia a lo largo de mi publicación:
Clothes
----------
ClothesID (PK) INT NOT NULL
Name VARCHAR(50) NOT NULL
Color VARCHAR(50) NOT NULL
Price DECIMAL(5,2) NOT NULL
BrandID INT NOT NULL
...
Brand_1
--------
ClothesID (FK/PK) int NOT NULL
ViewingUrl VARCHAR(50) NOT NULL
SomeOtherBrand1SpecificAttr VARCHAR(50) NOT NULL
Brand_2
--------
ClothesID (FK/PK) int NOT NULL
PhotoUrl VARCHAR(50) NOT NULL
SomeOtherBrand2SpecificAttr VARCHAR(50) NOT NULL
Brand_X
--------
ClothesID (FK/PK) int NOT NULL
SomeOtherBrandXSpecificAttr VARCHAR(50) NOT NULL
Planteamiento del problema
Tengo una mesa de ropa que tiene columnas como nombre, color, precio, brandid, etc. para describir los atributos de una prenda de ropa en particular.
Aquí está mi problema: las diferentes marcas de ropa requieren información diferente. ¿Cuál es la mejor práctica para tratar un problema como este?
Tenga en cuenta que para mis propósitos, es necesario encontrar información específica de la marca a partir de una entrada de ropa . Esto se debe a que primero muestro la información de una entrada de ropa al usuario, después de lo cual debo usar su información específica de la marca para comprar el artículo. En resumen, tiene que haber una relación direccional entre la ropa (de) y las tablas brand_x .
Solución propuesta / actual
Para hacer frente a esto, he pensado en el siguiente esquema de diseño:
La tabla de ropa tendrá una columna de marca que puede tener valores de identificación que varían de 1 a x, donde una identificación particular corresponde a una tabla específica de la marca. Por ejemplo, el valor de identificación 1 corresponderá a la tabla marca_1 (que podría tener una columna de URL ), la identificación 2 corresponderá a la marca_2 (que podría tener una columna de proveedor ), etc.
Por lo tanto, para asociar una entrada de ropa en particular con su información específica de la marca, imagino que la lógica a nivel de aplicación se verá más o menos así:
clothesId = <some value>
brand = query("SELECT brand FROM clothes WHERE id = clothesId")
if (brand == 1) {
// get brand_1 attributes for given clothesId
} else if (brand == 2) {
// get brand_2 attributes for given clothesId
} ... etc.
Otros comentarios y pensamientos
Estoy intentando normalizar toda mi base de datos en BCNF, y aunque esto es lo que se me ocurrió, el código de aplicación resultante me hace sentir muy ansioso. No hay forma de hacer cumplir las relaciones, excepto a nivel de aplicación, y por lo tanto el diseño se siente muy hacky y, anticipo, muy propenso a errores.
Investigación
Me aseguré de mirar las entradas anteriores antes de hacer una publicación. Aquí hay una publicación con un problema casi idéntico que logré encontrar. Hice esta publicación de todos modos porque parece que la única respuesta proporcionada no tiene una solución SQL o basada en diseño (es decir, menciona OOP, herencia e interfaces).
También soy un poco novato cuando se trata de diseño de bases de datos, por lo que agradecería cualquier idea.
Parece que hay respuestas más útiles en Stack Overflow:
- aquí
- Y aquí
- Aaa y aquí (el concepto clave es: herencia de tabla de clase)
Me he referido a las soluciones allí y sugiero que otros que encuentren mi pregunta también lo hagan.
A pesar de los enlaces proporcionados anteriormente, todavía estoy buscando respuestas aquí y agradecería cualquier solución provista.
Estoy usando PostgreSQL.