2013-02-20 37 views
6

Ví dụ:Tại sao django và python MySQLdb có một con trỏ trên mỗi cơ sở dữ liệu? kịch bản

MySQL chạy một máy chủ duy nhất -> HOSTNAME

Hai cơ sở dữ liệu MySQL trên máy chủ đó -> USERS, GAME.

Task -> Fetch 10 trò chơi mới nhất từ ​​GAMES.my_games_table, và lấy người sử dụng chơi những trò chơi từ USERS.my_users_table (giả sử không tham gia)

Trong Django cũng như Python MySQLdb, tại sao có một con trỏ cho mỗi cơ sở dữ liệu thích hợp hơn?

những bất lợi của một con trỏ mở rộng đó là duy nhất cho mỗi máy chủ MySQL và có thể chuyển đổi cơ sở dữ liệu (ví dụ như bằng cách truy vấn "USERS sử dụng;") là gì, và sau đó làm việc trên cơ sở dữ liệu

kết nối MySQL có giá rẻ tương ứng, nhưng isn 't kết nối duy nhất tốt hơn nhiều, nếu có một dòng chảy tuyến tính và không có tranasactions phức tạp mà có thể cần hai con trỏ?

+0

Django hỗ trợ nhiều kết nối cơ sở dữ liệu - https://docs.djangoproject.com/en/dev/topics/db/multi-db/ –

+0

@JonathanVanasco Vâng, đó chính xác là câu hỏi của tôi, tại sao nên có hai kết nối cho 2 cơ sở dữ liệu nằm trên máy chủ SAME. ví dụ: trong settings.py tôi sẽ phải định nghĩa cả USERS và GAMES, và django sẽ tạo 2 kết nối thay vì một. – DhruvPathak

+2

@ dm03514 Đó là một ví dụ. Giả sử phân mảnh hợp lý hoặc chỉ đọc nô lệ của một số cơ sở dữ liệu khác. Điểm mấu chốt là, nhiều cơ sở dữ liệu trên một cá thể mysql. – DhruvPathak

Trả lời

9

Câu trả lời ngắn hơn là, "MySQL không hỗ trợ loại con trỏ", vì vậy cũng không Python-MySQL, vì vậy lý do một lệnh kết nối được ưu tiên là vì đó là cách MySQL hoạt động. Đó là loại của tautology.

Tuy nhiên, câu trả lời còn là:

  1. A 'trỏ', theo định nghĩa của bạn, sẽ có một số loại đối tượng truy cập vào bảng và lập chỉ mục trong vòng một RDMS, khả năng duy trì trạng thái của nó.
  2. Một 'kết nối', theo định nghĩa của bạn, sẽ chấp nhận lệnh và phân bổ hoặc sử dụng lại con trỏ để thực hiện tác vụ của lệnh, trả về kết quả của nó cho kết nối.
  3. Theo định nghĩa của bạn, 'kết nối' sẽ/có thể quản lý nhiều con trỏ.
  4. Bạn cho rằng đây sẽ là cách ưa thích/hiệu suất để truy cập cơ sở dữ liệu dưới dạng 'kết nối' đắt tiền và 'con trỏ' rẻ.

Tuy nhiên:

  1. Một cursor trong MySQL (và RDMS khác) không phải là một cơ chế sử dụng có thể truy cập để thực hiện các hoạt động. MySQL (và của người khác) thực hiện các hoạt động như "set", hay đúng hơn, chúng biên dịch lệnh SQL của bạn thành một danh sách lệnh nội bộ, và thực hiện nhiều bit phức tạp tùy thuộc vào bản chất của lệnh SQL và cấu trúc bảng của bạn.
  2. A cursor là một cơ chế cụ thể, được sử dụng trong các thủ tục được lưu trữ (và chỉ có ở đó), tạo cho nhà phát triển cách làm việc với dữ liệu theo cách thủ tục.
  3. Một 'kết nối' trong MySQL là những gì bạn nghĩ là 'con trỏ', sắp xếp. MySQL không để lộ các nội bộ của nó cho bạn như một trình lặp hoặc con trỏ, mà chỉ đơn thuần là di chuyển qua các bảng. Nó cho thấy nội bộ của nó như là một 'kết nối' chấp nhận SQL và các lệnh khác, dịch các lệnh đó thành một hành động bên trong, thực hiện hành động đó và trả về kết quả của nó cho bạn.
  4. Đây là sự khác biệt giữa phong cách thực thi 'bộ' và 'thủ tục' (mà thực sự là về mức chi tiết của quyền kiểm soát bạn, người dùng, được cấp quyền truy cập hoặc ít nhất, chi tiết vốn có trong cách tóm tắt RDMS đi các bên trong của nó khi nó phơi bày chúng thông qua một API).
2

Như bạn nói, các kết nối MySQL có giá rẻ, vì vậy đối với trường hợp của bạn, tôi không chắc chắn có một lợi thế kỹ thuật nào cả, bên ngoài tổ chức mã và luồng. Có thể dễ dàng quản lý hai con trỏ hơn là theo dõi cơ sở dữ liệu mà một con trỏ duy nhất hiện đang nói đến bằng cách theo dõi cẩn thận các câu lệnh SQL 'USE'. Mileage với cơ sở dữ liệu khác có thể khác nhau - hãy nhớ rằng Django phấn đấu để được cơ sở dữ liệu bất khả tri.

Ngoài ra, hãy xem xét trường hợp hai cơ sở dữ liệu khác nhau, ngay cả trên cùng một máy chủ, yêu cầu thông tin xác thực truy cập khác nhau. Trong trường hợp này, hai kết nối sẽ là cần thiết để mỗi kết nối có thể xác thực thành công.

0

Một con trỏ trên mỗi cơ sở dữ liệu không nhất thiết phải thích hợp hơn, nó chỉ là hành vi mặc định.

Lý do là các cơ sở dữ liệu khác nhau thường không phải trên các máy chủ khác nhau, sử dụng các công cụ khác nhau và/hoặc cần các tùy chọn khởi tạo khác nhau. (Nếu không, tại sao bạn nên sử dụng "cơ sở dữ liệu" khác nhau ở nơi đầu tiên?)

Trong trường hợp của bạn, nếu hai cơ sở dữ liệu của bạn chỉ là không gian tên của bảng (được gọi là "lược đồ" trong thuật ngữ SQL) cùng một cá thể MySQL, sau đó bằng mọi cách sử dụng một kết nối duy nhất. (Làm thế nào để cấu hình Django để làm như vậy thực sự là một câu hỏi hoàn toàn khác.)

Bạn cũng đúng là một kết nối duy nhất là tốt hơn hai, nếu bạn chỉ có một chủ đề duy nhất và không thực sự cần hai nhân viên cơ sở dữ liệu cùng lúc.

Các vấn đề liên quan