![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 86 Pomógł: 20 Dołączył: 20.01.2010 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Robię w php i mysql bazę danych do zleceń produkcji. Elementem formularza jest pole 22 checkboxów (opcje dodatkowe), które muszę później zapisać i odczytać z bazy danych. Opcje te mogą się zmieniać, dlatego dobrze by było, gdyby dało się je łatwo edytować. Stworzyłem tabelę `opcje` (id, nazwa) i do formularza pobieram z niej wszystkie. Przy zapisywaniu do tabeli `zlecenia` przez funkcję implode() wrzucam je jako jeden łańcuch do komórki opcje_dodatkowe. Później, zależnie od potrzeb muszę zrobić explode() i porównać z odpowiednimi id w tabeli `opcje`. Boję się jednak, że takie rozwiązanie okaże się na dłuższą metę bardzo zasobożerne - już teraz łańcuch numerków z 22 checkboxów może mieć ponad 50 znaków. Czy ktoś ma pomysł jak to lepiej ugryźć? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 278 Pomógł: 44 Dołączył: 17.02.2004 Skąd: Wieliczka Ostrzeżenie: (10%) ![]() ![]() |
Ges, no też ciekawe rozwiązanie.
Szczerze, to wszystko zależy od konkretnej sytuacji. Relacja 1:1 nie zawsze jest najlepsza. No i też zawsze to nowa tabela z minimum 2 kolumnami id i opcja, no i tez tyle tych rekordów ile w najlepszym wypadku zaznaczonych tylko checków, w najgorszym tyle ile wszystkich checków ...jeszcze pomnożyć przez ilość userów i mamy już dosyć pokaźne wielkości. Podane przeze mnie rozwiązanie nie jest idealne, ale też nie jest jakieś skomplikowane. Opiera się na jednej kolumnie o długości n znaków, każdy odpowiada kolejnemu checkowi i przyjmuje wartość 1 lub 0 - coś na wzór maski bitowej. Nie trzeba nic explodować, łatwo też tym operować na poziomie zapytania stosując wzorzec lub odwołując się do konkretnego znaku lub znaków (stanu checkboxa) za pomocą SUBSTRING. Tak czy owak, akurat w kilku sytuacjach wygodniej mi było przeznaczyć na usera 1 pole o długości 100bajtów, niż w nowej tabeli 100 rekordów po minimum 5 bajtów każdy (4 na id usera i 1 id checkboxa) -wprawdzie oszczędniej było by operować na pojedyńczych bitach, nie zaś na całych bajtach. W sumie metoda trochę zbliżona do tej jaką zapodał Ges. (IMG:style_emoticons/default/dry.gif) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 17.10.2025 - 15:27 |