Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL] Struktura tabeli z różnymi typami wartości
epg.kojak
post 7.11.2013, 10:18:13
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 5.11.2013
Skąd: Warszawa

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


Witam,

mam pewien problem związany z optymalizacją struktury bazy danych. Postaram się dokładnie to wytłumaczyć.

Tworzę pewien projekt, gdzie będzie można dodawać różne wartości, jednak będą one odzworowane jako różny typ kolumn w bazie (np. int, double, varchar). Jak najlepiej zapisywać te różne wartości w bazie. W projekcie używam Propel 1.6. Chodzi o to, że mogę dodawać wartość typu 'int' lub 'varchar' itd, aby przeszukiwanie tabeli było wydajne.

W sumie mam dwa pomysły. Pierwszy to stworzenie tabeli "value", która będzie miała kolumny: "id", "value_int", "value_double", "value_varchar", itd - z odpowiednimi typami kolumn. W zależności od typu wartości, rekordy będą zapisywane z wartością w odpowiedniej kolumnie (w reszcie będzie NULL).

Drugie rozwiązanie to stworzenie osobnych tabel, np. "value_int", "value_varchar" itd. Tu by były kolumny: "id", "value", które odpowiadałyby odpowiednim typom dla "value" (czyli, np. int, varchar, itd).

Nie ukrywam, że nie mam przekonania do żadnego z powyższych rozwiązań, pierwotnie zastanawiałem się nad jedną tabelą "value", gdzie kolumna byłaby typu "text" - jednak to rozwiązanie byłoby chyba jeszcze gorsze.

Chciałbym poznać Wasze zdanie na ten temat, może coś innego byłoby lepsze. Z góry dzięki.

|| edit:
prośba o przeniesienie do działu "Bazy danych" - drobna pomyłka wink.gif

Ten post edytował phpion 7.11.2013, 11:14:45
Powód edycji: [phpion]: Przeniosłem.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
epg.kojak
post 7.11.2013, 12:38:37
Post #2





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 5.11.2013
Skąd: Warszawa

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


Właśnie chodzi o to, że będę często wyszukiwał. Ogólnie tabela z wartościami to wierzchołek całej góry. Wartości będą powiązanie z innymi tabelami, i np. dla konkretnego wiersza z innej tabeli będą przyporządkowane wartości.

Dla przykładu:

Mamy 3 tabele:

USER: [tabela z użytkownikami]
* id
* name

FIELD: [tabela z polami profilu - gdzie kolumna 'type' to typ pola, czyli np. int, czy varchar)
* id
* type
* name

VALUE:
* id
* user_id - (FK user.id)
* field_id - (FK field.id)
* value

Czyli w tabeli USER mamy w każdym wierszu użytkownika, a jego profil jest zapisany w tabeli VALUE. Tylko że każde z pól profilowych może mieć różny typ (kolumna 'type' w tabeli FIELD), i na podstawie tego chciałbym żeby ta wartość trafiała do odpowiedniej kolumny, o odpowiednim typie.

Ktoś zasugerował mi normalizację... nie znam dokładnie jej definicji, na razie czytam o tym.

|| edit

Co do pola TEXT, to był mój pierwszy pomysł, ale chciałbym nie wrzucać pola typu TINYINT(1), do dużego pola TEXT, bo przy ogromnej liczbie rekordów w tabeli VALUE, bedzie, w/g mnie, niepotrzebny narzut wydajnościowy. To co napisałem z użytkownikami, to tylko przykład, dużo bardziej rozbudowany jest. Ale koncepcja jest taka, żeby były wartości przypisane do pewnych atrybutów, i w zależności od różnych typów, lądowały do odpowiedniej kolumny.

Pomyślałem, że jak byłoby kilka tabel, które bym JOINował i wybierał sobie odpowiednią wartość z jednej kolumny, która nie jest NULLem, to by rozwiązało problem, tylko czy nie będzie to zbyt mało optymalne?

Ten post edytował epg.kojak 7.11.2013, 12:55:00
Go to the top of the page
+Quote Post

Posty w temacie


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: 28.06.2025 - 07:16