Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP/MySql] 4 tabele w bazie zamiast wielu
Forum PHP.pl > Forum > PHP
Sajrox
Witam,

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'.

  1. 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:
  1. ID NAME VALUE FIELD_ID
  2. 1 Auchan Poznań 1
  3. 1 Auchan 1234 2
  4. 2 WBK Warszawa 1
  5. 2 WBK 5678 2
  6. 3 Żabka Gorzów 1
  7. 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:
  1. SELECT t1.name, t2.*
  2. 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
  3. LEFT JOIN components_data AS t2 ON t1.id=t2.component_id


  1. NAME COMPONENT_ID FIELD_ID VALUE
  2. Żabka 3 1 Gorzów
  3. Żabka 3 2 34523523
  4. Auchan 1 1 Poznań
  5. Auchan 1 2 1234
  6. WBK 2 1 Warszawa
  7. WBK 2 2 5678



Co myslicie o tym pomyśle ?
-=Peter=-
Myślę, że to idiotyzm. Podstawowe argumenty: nieczytelne, nie korzystasz z typów kolumn z bazy danych (wszystko przechowujesz w varcharze?), nie korzystasz z kluczów obcych, ograniczona możliwość optymalizacji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.