![]() |
![]() |
![]()
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 ![]() Ten post edytował phpion 7.11.2013, 11:14:45
Powód edycji: [phpion]: Przeniosłem.
|
|
|
![]() |
![]()
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 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 28.06.2025 - 07:16 |