![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 47 Pomógł: 0 Dołączył: 4.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Problem generalnie stary jak bazy danych w związku z czym sposobów na radzenie sobie z nadmiarowością również nie brakuje. Jednakże ostatnio doszedłem do wniosku, że o ile eliminowanie nadmiarowości w teorii wygląda na sprawę dość łatwą (a jeśli nie łatwą to przynajmniej jasno opisaną) o tyle w praktyce nie jest już tak różowo. Rozważmy taki prosty z "życia wzięty" przypadek. Mamy bazę danych, w której istnieją trzy tabele: klienci, towary i faktury. Tabela faktury ma przechowywać wszystkie faktury wystawione dla danych klientów na dane towary. Oczywiście sprawa wygląda na wręcz banalną. Książkowe rozwiązanie tego problemu to utworzenie w tabeli faktury kluczy obcych tabeli klientow i tabeli towarów (plus oczywiście dodatkowe pola charakteryzujące daną faturę jak numer, data wystawienia itd.). Dzięki takiemu rozwiązaniu unikamy wspomnianej nadmiarowości ponieważ nigdzie nie powielamy danych. W praktyce jednak takie rozwiązanie średnio nas zadowala ponieważ jeśli wystawimy dla danego użytkownika kilka faktur, a później zedytujemy jego dane, to dane te również zmienią się na fakturach wystawionych przed edycją danych klienta (taka operacja jest niedpopuszczalna). I tutaj zaczynają się schody - jak rozwiązać ten problem unikając nadmiarowości, a jednocześnie nie komplikując zbytnio bazy, a tym samym aplikacji? Oczywiście najprościej było by stworzyć ogromną tabelę faktury, która zawiera pola tabeli klienci i tabeli towary i przy dodawaniu nowej faktury kopiować wszystkie dane z tych tabel. Takie jednak tworzenie "super tabel" kłuci się generalnie z ideą relacyjności (nie mówiąc już nawet o nadmiarowości) dlatego wolałbym tego unikać. Z drugiej jednak strony tak się zastanawiam czy jest sens starać się za wszelką cenę eliminować tego typu nadmiarowość kosztem komplikacji systemu, w bazach gdzie będzie góra kilka tysięcy rekordów? Jakie jest wasze zdanie na ten temat i jak wy sobie radzicie z tym problemem? Pozdrawiam, who? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
Przykład z fakturami nie jest zbyt trafny. Przecież faktura zamawiana przez Kowalskiego może być wystawiona na Nowaka. W tabeli z fakturami i tak trzeba trzymać imię, nazwisko (ew. nazwa firmy), adres, nip itd (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
A co do nadmiarowości. Czasami trzeba trzymać w kilku tabelach te same dane, chociażby ze względu na wydajność. Jeśli masz trzy tabele, a w każdej po kilkadziesiąt (kilkaset) tysięcy wierszy, wówzcas łączenie tych tabel, by wyjąć np. adres email staje się zadaniem bardzo zamulającym aplikację. Najlepiej trzymać ten adres email w kilku tabelach. Ponadto jeśłi zmieni się adres tez się zmieni w tabeli z użytkownikami nie musimy tworzyć historii, logów, itp o tym co kiedy było na jaki adres wysłane, ponieważ mamy to w interesującej nas tabeli. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 10.10.2025 - 14:06 |