Proponowany schemat
Przede wszystkim oto przykład mojego proponowanego schematu, do którego można odwoływać się w całym poście:
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
Opis problemu
Mam stolik z ubraniami, który ma kolumny takie jak nazwa, kolor, cena, brandid i tak dalej, aby opisać atrybuty konkretnego elementu odzieży.
Oto mój problem: różne marki odzieży wymagają różnych informacji. Jaka jest najlepsza praktyka radzenia sobie z takim problemem?
Pamiętaj, że dla moich celów konieczne jest znalezienie informacji specyficznych dla marki, poczynając od pozycji ubrania . Wynika to z tego, że najpierw wyświetlam użytkownikowi informacje z pozycji dotyczącej ubrań , a następnie muszę użyć informacji specyficznych dla marki, aby kupić produkt. Podsumowując, musi istnieć kierunkowa zależność między ubraniami (od) a tabelami brand_x .
Proponowane / aktualne rozwiązanie
Aby sobie z tym poradzić, pomyślałem o następującym schemacie projektu:
Ubrania tabela mają zupełnie kolumnę, która może mieć wartości identyfikacyjnych od 1 do X, gdzie poszczególne odpowiada identyfikacyjnych tabeli danej marki. Na przykład wartość identyfikatora 1 będzie odpowiadać tabeli brand_1 (która może mieć kolumnę URL ), identyfikator 2 będzie odpowiadać brand_2 (która może mieć kolumnę dostawcy ) itp.
Tak więc, aby powiązać konkretny wpis dotyczący ubrania z informacjami dotyczącymi marki, wyobrażam sobie, że logika na poziomie aplikacji będzie wyglądać mniej więcej tak:
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.
Inne komentarze i przemyślenia
Próbuję znormalizować całą bazę danych w BCNF i chociaż to właśnie wymyśliłem, wynikowy kod aplikacji sprawia, że czuję się bardzo niespokojny. Nie ma sposobu na wymuszenie relacji poza poziomem aplikacji, a zatem projekt jest bardzo zepsuty i, jak sądzę, bardzo podatny na błędy.
Badania
Przed napisaniem posta sprawdziłem poprzednie wpisy. Oto post z prawie identycznym problemem, który udało mi się znaleźć. I tak napisałem ten post, ponieważ wydaje się, że jedyna podana odpowiedź nie ma rozwiązania SQL ani rozwiązania projektowego (tj. Wspomina OOP, dziedziczenie i interfejsy).
Jestem także nowicjuszem, jeśli chodzi o projektowanie baz danych, dlatego doceniłbym wszelkie spostrzeżenia.
Wygląda na to, że na przepełnieniu stosu znajdują się bardziej pomocne odpowiedzi:
- Tutaj
- I tu
- Aaaa tutaj (kluczową koncepcją jest: dziedziczenie tabeli klas)
Odniosłem się do tamtejszych rozwiązań i sugeruję, aby inni również znaleźli moje pytanie.
Pomimo podanych powyżej linków wciąż szukam odpowiedzi tutaj i doceniłbym wszelkie dostarczone rozwiązania!
Używam PostgreSQL.