Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nietypowe zapytanie typu DELETE
Forum PHP.pl > Forum > Bazy danych > MySQL
splatch
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?
SongoQ
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.
splatch
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:


Teraz zmniejszam ilość pól w tablicy do 3.


Ale w bazie w dalszym ciągu jest, ponieważ nie potrafię usunąć tych rekordów, które są zbyteczne.


Ostatni diagram jest troszke niewyraźny, przedstawiam wersję graficzną. smile.gif


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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.