Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP/MySql] 4 tabele w bazie zamiast wielu, Nietypowy sposób trzymania danych w bazie
Sajrox
post 6.04.2010, 18:28:39
Post #1





Grupa: Zarejestrowani
Postów: 254
Pomógł: 7
Dołączył: 9.10.2007
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
-=Peter=-
post 6.04.2010, 18:37:05
Post #2





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.07.2025 - 11:18