2013-02-20 11 views
6

Przykładowy scenariusz:Dlaczego django i python MySQLdb mają jeden kursor na bazę danych?

MySQL działa jeden serwer -> Nazwa

dwóch baz danych MySQL na tym serwerze -> Users, gier.

Zadanie -> Pobierz 10 najnowsze gry z GAMES.my_games_table, i przynieś użytkowników grających w te gry z USERS.my_users_table (zakładamy brak przyłącza)

W Django, jak Python MySQLdb, dlaczego jest o jeden wskaźnik dla każdego baza bardziej preferowana?

Co jest wadą dłuższy kursora który jest pojedynczy na serwer MySQL i można przełączyć baz danych (na przykład poprzez odpytywanie „użytkownicy korzystają;”), a następnie pracować na odpowiednich bazę

połączenia MySQL są tanie, ale ISN pojedyncze połączenie jest lepsze niż wiele, jeśli istnieje liniowy przepływ i brak skomplikowanych operacji, które mogą wymagać dwóch kursorów?

+0

Django obsługuje wiele połączeń z bazami danych - https://docs.djangoproject.com/en/dev/topics/db/multi-db/ –

+0

@ JonathanVanasco Tak, to jest dokładnie moje pytanie, dlaczego powinny istnieć dwa połączenia dla 2 bazy danych znajdujące się na serwerze SAME SERVER. np. w settings.py musiałbym zdefiniować zarówno USERS, jak i GAMES, a django stworzy 2 połączenia zamiast jednego. – DhruvPathak

+2

@ dm03514 To jest przykładowy scenariusz. Przyjmij logiczne odłamki lub odczytaj tylko niewolę jakiejś innej bazy danych. Dolna linia to wiele baz danych na jednej instancji mysql. – DhruvPathak

Odpowiedz

9

Krótsza odpowiedź byłaby: „MySQL nie obsługuje tego typu kursora”, więc nie robi Pythona MySQL, więc komenda powodem jedno połączenie jest korzystne, ponieważ jest to sposób, w jaki działa MySQL. Która jest rodzajem tautologii.

Jednak już odpowiedź brzmi:

  1. kursor A „”, według definicji, byłby jakiś rodzaj obiektu dostępu do tabel i indeksów w ramach RDMS, umożliwiający utrzymanie jego stanu.
  2. "Połączenie", zgodnie z definicją, będzie przyjmować polecenia, a także przydzielić lub ponownie użyć kursora, aby wykonać działanie polecenia, zwracając jego wyniki do połączenia.
  3. Według definicji "połączenie" może/może zarządzać wieloma kursorami.
  4. Uważasz, że byłby to preferowany/wydajny sposób dostępu do bazy danych, ponieważ "połączenia" są drogie, a "kursory" są tanie.

Jednakże:

  1. cursor w MySQL (i innych RDMS) nie jest mechanizm dostępne dla użytkownika do wykonywania operacji. MySQL (i inne) wykonują operacje jako "zestaw" lub raczej kompilują polecenie SQL na wewnętrzną listę poleceń i wykonują liczne, złożone bity w zależności od charakteru polecenia SQL i struktury tabeli.
  2. A cursor to specyficzny mechanizm, wykorzystywany w ramach procedur przechowywanych (i tylko tam), umożliwiający programistom pracę z danymi w sposób proceduralny.
  3. "Połączenie" w MySQL to coś, co uważasz za "kursor". MySQL nie ujawnia wewnętrznych elementów dla ciebie jako iteratora lub wskaźnika, który jedynie przesuwa się po tabelach. Ujawnia to wewnętrznie jako "połączenie", które akceptuje SQL i inne polecenia, tłumaczy te polecenia w wewnętrzną akcję, wykonuje tę akcję i zwraca jej wynik.
  4. To jest różnica między "zestawem" i "proceduralnym" stylem wykonania (chodzi tu o szczegółowość kontroli, użytkownik, użytkownik ma dostęp do, lub przynajmniej, ziarnistość właściwą dla tego, jak streszczenia RDMS z dala od jego wewnętrznych elementów, gdy udostępnia je za pośrednictwem interfejsu API).
2

Tak jak mówisz, połączenia MySQL są tanie, więc dla twojego przypadku nie jestem pewien, czy istnieje przewaga techniczna w żaden sposób, poza organizacją kodu i przepływem. Łatwiej będzie zarządzać dwoma kursorami niż śledzić, z której bazy danych rozmawia obecnie pojedynczy kursor, starannie śledząc instrukcje SQL "USE". Przebieg z innymi bazami danych może się różnić - pamiętaj, że Django stara się być agnostykiem bazy danych.

Weź również pod uwagę przypadek, w którym dwie różne bazy danych, nawet na tym samym serwerze, wymagają różnych poświadczeń dostępu. W takim przypadku konieczne będą dwa połączenia, aby każde połączenie mogło zostać uwierzytelnione.

0

Jeden kursor na bazę danych niekoniecznie jest preferowany, jest to domyślne zachowanie.

Uzasadnieniem jest to, że różne bazy danych są nie częściej niż na różnych serwerach, należy użyć różnych silników i/lub wymagają różnych opcji inicjalizacji. (W przeciwnym razie, dlaczego miałbyś najpierw używać różnych "baz danych"?)

W twoim przypadku, jeśli twoje dwie bazy danych są tylko przestrzeniami nazw tabel (co powinno być nazywane "schematami" w żargonie SQL), ale rezydują na w tej samej instancji MySQL, a następnie za pomocą pojedynczego połączenia. (Jak skonfigurować Django, aby to zrobić, jest zupełnie inne pytanie.)

Masz rację, że jedno połączenie jest lepsze niż dwa, jeśli masz tylko jeden wątek i nie potrzebujesz w rzeczywistości dwóch pracowników bazy danych o tym samym czasie.

Powiązane problemy