Esquema proposto
Primeiro e acima de tudo, aqui está um exemplo do meu esquema proposto para referência em toda a minha postagem:
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
Declaração do problema
Eu tenho uma mesa de roupas com colunas como nome, cor, preço, marca e assim por diante para descrever os atributos de uma determinada peça de roupa.
Aqui está o meu problema: marcas diferentes de roupas exigem informações diferentes. Qual é a melhor prática para lidar com um problema como esse?
Observe que, para meus propósitos, é necessário encontrar informações específicas da marca a partir de uma entrada de roupas . Isso ocorre porque eu exibo primeiro as informações de uma entrada de roupas para o usuário, após o qual devo usar as informações específicas da marca para comprar o item. Em resumo, deve haver uma relação direcional entre roupas (de) e as tabelas brand_x .
Solução proposta / atual
Para lidar com isso, pensei no seguinte esquema de design:
A tabela de roupas terá uma coluna de marca que pode ter valores de ID que variam de 1 a x, onde um ID específico corresponde a uma tabela específica de marca. Por exemplo, o valor do ID 1 corresponderá à tabela brand_1 (que pode ter uma coluna de URL ), o id 2 corresponderá à marca_2 (que pode ter uma coluna de fornecedor ) etc.
Assim, para associar uma entrada de roupas específica a suas informações específicas da marca, imagino que a lógica no nível do aplicativo seja algo parecido com isto:
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.
Outros comentários e pensamentos
Estou tentando normalizar meu banco de dados inteiro no BCNF e, embora tenha sido o que eu criei, o código do aplicativo resultante me deixa muito ansioso. Não há como impor relações, exceto no nível do aplicativo, e, portanto, o design parece muito invasivo e, antecipadamente, muito suscetível a erros.
Pesquisa
Fiz questão de examinar as entradas anteriores antes de fazer uma postagem. Aqui está um post com um problema quase idêntico que eu consegui encontrar. Fiz este post de qualquer maneira, porque parece que a única resposta fornecida não tem uma solução baseada em design ou SQL (isto é, menciona OOP, herança e interfaces).
Também sou um novato no que diz respeito ao design de banco de dados e, por isso, gostaria de receber informações.
Parece que há respostas mais úteis no Stack Overflow:
- Aqui
- E aqui
- Aqui e aqui (conceito-chave: herança da tabela de classes)
Mencionei as soluções lá e sugiro que outras pessoas também encontrem minha pergunta.
Apesar dos links fornecidos acima, ainda estou à procura de respostas aqui e agradeceria qualquer solução fornecida!
Estou usando o PostgreSQL.