Mam pewny pomysł do trzymania danych w bazie.
Przykładowo standardowo w bazie miałbym 3 główne tabele: users, firms, products itd... Każda trzyma odpowiednie dane dla swojego przeznaczenia
Jednak chciałbym uzyć trochę innej techniki.
Otóż chciałbym stworzyć 4 tabele które będą trzymać wszystko . Będą to:
components_types -> id | type
components -> id | name | type_id
components_fields -> id | field | type_id
components_data -> component_id | field_id | value
Wyjaśnienie
components_types - są to rodzaje komponentów np user, firm, product
components - tutaj są nasze komponenty, którymi mogą być firmy, użytkownicy, produkty itd...
components_fields - to są kolumny (odpowiedniki pol w bazie danych dla każdego komponentu) np dla users: login, pass, city itd..
components_data - tutaj są wartości do wyżej wymienionych pól.
Zamiast posiadać dla każdego modułu (firms, users, ...) osobne tabele w bazie. Tworze jedną strukturę.
Gdy chce pobrać wszystkich użytkowników musze uzyć trochę php do otrzymania tablicy danych tak jakbym pobierał uch z typowej tabeli 'users'.
SELECT cd.component_id AS id, c.name, cd.value, cd.field_id FROM components_data AS cd LEFT JOIN components AS c ON cd.component_id=c.id WHERE c.type_id = 1
Otrzymuje takie dane:
ID NAME VALUE FIELD_ID 1 Auchan Poznań 1 1 Auchan 1234 2 2 WBK Warszawa 1 2 WBK 5678 2 3 Żabka Gorzów 1 3 Żabka 34523523 2
Teraz musze pobrać jeszcze wszystkie pola z tabeli 'components_fields' dla komponentu typu user. Wtedy wiemy że field_id o id=1 to Miasto, o id=2 to telefon itd..
Po przemieleniu tego przez pętle w php możemy otrzymać normalną tablice z danymi które następnie możemy wyświetlić na stronie.
Gdy chcemy posortować po mieście:
SELECT t1.name, t2.* FROM (SELECT cd.component_id AS id, c.name FROM components_data AS cd LEFT JOIN components AS c ON cd.component_id=c.id WHERE cd.field_id = 1 AND c.type_id=1 ORDER BY cd.value ASC) AS t1 LEFT JOIN components_data AS t2 ON t1.id=t2.component_id
NAME COMPONENT_ID FIELD_ID VALUE Żabka 3 1 Gorzów Żabka 3 2 34523523 Auchan 1 1 Poznań Auchan 1 2 1234 WBK 2 1 Warszawa WBK 2 2 5678
Co myslicie o tym pomyśle ?