![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 4 Dołączył: 4.02.2010 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Od jakiegoś czasu realizuję pewien projekt. Problemów jest sporo ponieważ baza danych jest (to moje zdanie) źle zaprojektowana. Końcowym produktem ma być LogViewer wyświetlający logi z sześciu różnych tabel z filtrami i stronicowaniem. Wszystko było by dużo prostrze gdyby logi były w jednej tabeli a są w aż sześciu i to o różnych strukturach. Problem jest konkretnie ze stronicowaniem. W jaki sposób pobrać wszystko z tych tablic aby móc zrobić LIMIT w zapytaniu (od tego do tego rekordu, w zależności od aktualnej strony). UNION nie zadziała ze względu na różne struktury, o joinach można zapomnieć ponieważ nie ma żadnych relacji a pole klucz (ai) posiada tylko jedna z tych tabel. Pomysły? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 195 Pomógł: 109 Dołączył: 3.11.2011 Ostrzeżenie: (10%) ![]() ![]() |
Cytat Problemów jest sporo ponieważ baza danych jest (to moje zdanie) źle zaprojektowana. No to fakt, relacyjna baza bez relacji (IMG:style_emoticons/default/baaasmiley.gif) Możesz spróbować pokombinować z cross join: http://www.roseindia.net/sql/sqljoin/mysql-cross-join.shtml http://stackoverflow.com/questions/8473625...ut-relationship Najlepiej przeprojektować bazę danych , brak indexów-ma znaczenie przy optymalizacji i szybkości wykonywania się zapytań-będzie działać znacznie wolniej niż w przypadku tabel indeksowanych.Brak wiązań danych ,będzie utrudniało wyciąganiu odpowiednich danych-będziesz musiał budować zawiłe kwerendy, które będą się także wolniej wykonywały. Ten post edytował Niktoś 28.07.2012, 17:10:22 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 4 Dołączył: 4.02.2010 Ostrzeżenie: (0%) ![]() ![]() |
Co do przeprojektowania bazy danych to nie ma takiej opcji ponieważ jest to baza pewnej gry mmorpg i za dużo z tym roboty (poza tym ja tylko tworzę LogViewer, nie mam wpływu na krztałt bazy).
Na mój rozum cross join też odpada bo nie mam czego podać po ON w zapytaniu. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 195 Pomógł: 109 Dołączył: 3.11.2011 Ostrzeżenie: (10%) ![]() ![]() |
Przecież w cross join nie ma złączenia ON.
Przeanalizuj jeszcze tutaj: http://www.hiteshagrawal.com/mysql/mysql-cross-join-queries |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 4 Dołączył: 4.02.2010 Ostrzeżenie: (0%) ![]() ![]() |
Fakt, coś mi się ubzdurało - mniejsza z tym. Przy CROSS JOIN zapytanie trwa już ponad 5 minut i końca nie widać. Odpada.
Na forum frameworka którego używam polecono mi widoki. Przyznam się szczerze czytałem, ale ani trochę nie rozumiem jak miały by mi pomóc. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 195 Pomógł: 109 Dołączył: 3.11.2011 Ostrzeżenie: (10%) ![]() ![]() |
Tutaj masz jak wykorzystać widoki:
http://www.java2s.com/Tutorial/MySQL/0180_...ngtwotables.htm , ale i tak podczas tworzenia będziesz musiał zespolić dane z różnych tabel.Widok uprości Ci tylko sposób odwołania się do bazy danych w Twoim skrypcie php. Będziesz musiał użyć polecenia cross join w widoku i odwołujesz się w php do widoku zamiast konkretnej/-ych tabel/-i. Coś w stylu: Select * from Moj_Widok; Ten post edytował Niktoś 28.07.2012, 18:05:28 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 4 Dołączył: 4.02.2010 Ostrzeżenie: (0%) ![]() ![]() |
Troche się pobawiłem tymi widokami i wyszło mi coś czego nie chcę. Mianowicie dostałem widok o strukturze gdzie jeden rekord posiada wszystkie pola z tych 6 różnych tabel. To błąd bo ja chcę czegoś innego. Nie chodzi mi o to aby każdy rekord miał dane z tych 6 tabel a by stworzyła się taka jak by tablica w w której kolejno ułożone są (jeden pod drugim) rekordy z wszystkich sześciu tabel.
Coś w stylu:
Czyli tak jak bym zrobił 6 zwykłych zapytań i każdy rekord z tych zapytań jest kolejnym elementem tablicy je zawierającej. Tak wyświetlam dane, ale przy paginacji muszę pobrać je wszystkie naraz by nałożyć limity w zapytaniu (w zależności od aktualnie wyświetlanej strony) |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 60 Dołączył: 25.02.2012 Ostrzeżenie: (0%) ![]() ![]() |
A spróbuj zrobić sześć odrębnych widoków, aby każdy wyświetlał logi z odpowiedniej tabeli w taki sam sposób (czyli by doprowadzić do ujednoliconego formatu). I na koniec siódmy widok wyświetlający posortowane wiersze z pozostałych widoków.
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 87 Pomógł: 12 Dołączył: 31.05.2006 Ostrzeżenie: (0%) ![]() ![]() |
A może zamiast się grzebać w widokach ( które i tak będą się pewnie trochę kręciły ) lepiej byłoby napisać procedurkę, która zbierałaby dane z tych cześciu tabel do jednej nowo utworzonej przez Ciebie tabeli (IMG:style_emoticons/default/questionmark.gif)
Miałbyś już wtedy jednolitą konstrukcję tabeli, założyłbyś na niej odpowiednie indeksy i wyciąganie danych byłoby znacznie prostsze. Napełnianie tej tabeli mógłbyś zaplanować po północy każdego dnia np. z ograniczeniem danych do poprzedniego dnia. Ten post edytował trafas 3.08.2012, 11:24:52 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 12:27 |