Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%)
|
Witam serdecznie, mam problem z zapytaniem, ktore ma usuwac wiersze, ktore sa zbyteczne. Chodzi o usunięcie zbytecznych rekordów. Struktura:
Kod 1[__user_parameter_values___] [___user_parameter___] +--|user_parameter_values_id |* +--------|user_parameter_id | | |user_parameter_id |<-----+ 1|user_parameter_name | | |user_id | |user_parameter_array| | +--------------------------+ |user_parameter_size | | +--------------------+ | [__user_parameter_value__] | |user_parameter_value_id | +-->|user_parameter_values_id| 1..n|user_parameter_value | +------------------------+ Struktura ta ma umożliwić zapis wielu wartości. Każdy parametr może być tablicą - określa to kolumna user_parameter.user_parameter_array. Jeśli parametr jest tablicą to wtedy w tabeli pośredniczącej user_parameter_values wciąż jest jeden wiersz, ponieważ pojedyńcza wartość jest zapisywana w user_parameter_value. Mój problem jest następujący - przy zmianie rozmiaru tablicy na mniejszy chcę usunąć zbędne rekordy z user_parameter_value. Na załączonym obrazku jest zaznaczone, że pomiędzy relacją user_parameter_values a user_parameter_value zachodzi związek 1..n. W rzeczywistości związek ten to 1..user_parameter.user_parameter_size. Jeżeli mam w takiej strukturze dane, powiedzmy.. numer telefonu określony jako tablicę o rozmiarze 3 i nagle decyduję się na zmniejszenie liczby numerów do 2 to pozostaje jeden zbyteczny wiersz. Utrudnieniem jest to, że całość jest realizowana przez tabelkę pośredniczącą. Czy ktoś wie jak rozwiązać mój problem? |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%)
|
To troche odchodzi od zalozen baz danych. Jesli masz tablice i dodatkowo stosujedz 2 tabele aby to zobrazowac relacyjnie to w tym momencie dane sie duplikuja (powstaje nadmiarowosc) ktora moze prowadzic do bledow.
Mozesz zrezygnowac z tej tablicy i upychac w rekordy ktore podales i wtedy usuniecie jest banalna sprawa. 2 pomysl to np PG umozliwia zapisanie tablicy w DB i wtedy musislbys miec taki schemat aby wartosc / index z tego pola odpowiadalo rekordowi z user_parameter_value. Z tego co wiem to chyba zadna baza takich relacji nie oferuje. Przedstaw wiecej szczegolow zastosowania, moze wtedy bedzie jasniej. |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%)
|
Ten sposób jest optymalny ponieważ w MySQL nic lepszego nie ma, tzn. tak jak piosałeś nie ma typów tablicowych, trzeba je poniekąd emulować.
W takiej sytuacji nadmiarowość nie powstaje, ponieważ nie są nigdzie dublowane wartości. user_parameter jest pojedyńczy, user_parameter_values jest primary key+unique na user_id+user_parameter_id, a w user_values jest tylko dowiązanie. Moim zdaniem związki i relacje są w porządku. Jest to wyjście na pewno lepsze niż serializowanie tablicy w polu tekstowym. Przypominam, chodzi mi o zapytanie które usunie z user_parameter_values zbędne rekordy (tzn. te, które są ponad user_parameter.user_parameter_size). dodatkowe informacje Tak wygląda interfejs: (IMG:http://img.dywicki.pl/db/screen_1.jpg) Teraz zmniejszam ilość pól w tablicy do 3. (IMG:http://img.dywicki.pl/db/screen_3.jpg) Ale w bazie w dalszym ciągu jest, ponieważ nie potrafię usunąć tych rekordów, które są zbyteczne. (IMG:http://img.dywicki.pl/db/screen_4.jpg) Ostatni diagram jest troszke niewyraźny, przedstawiam wersję graficzną. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) (IMG:http://img.dywicki.pl/db/screen_5.jpg) Struktura ta sprawdza się w działaniu - mam zrobioną edycję, dodawanie oraz usuwanie danych, ale niestety nie mogę sobie poradzić z sytuacją, kiedy zmniejsza się rozmiar tablicy. Mogę to oczywiście załatwić z poziomu php, nie mniej wolałbym to zrobić jednym, góra dwoma zapytaniami i to bez przerzucania nic przez php. Ten post edytował splatch 29.03.2006, 10:05:47 |
|
|
|
![]() ![]() |
|
Aktualny czas: 19.12.2025 - 18:34 |