2008-09-17 23 views
18

Kể từ khi Google App Engine Datastore được dựa trên Bigtable và chúng ta biết rằng không phải là một cơ sở dữ liệu quan hệ, làm thế nào để bạn thiết kế một cơ sở dữ liệu schema/mô hình dữ liệu cho các ứng dụng sử dụng loại hệ thống cơ sở dữ liệu?Làm thế nào để bạn thiết kế mô hình dữ liệu cho Bigtable/Datastore (GAE)?

+0

Xem [câu hỏi này] (http://stackoverflow.com/questions/103727/how- cơ sở dữ liệu thay vì-trong-dữ liệu-lưu trữ-thay-cho-cơ sở dữ liệu), yêu cầu nhiều hơn hoặc ít hơn cùng một điều. –

Trả lời

19

Thiết kế một sơ đồ bigtable là một quá trình mở, và về cơ bản đòi hỏi bạn phải suy nghĩ về:

  • Các mô hình truy cập bạn sẽ được sử dụng và mức độ thường xuyên mỗi sẽ được sử dụng
  • Các mối quan hệ giữa các loại bạn
  • (tải để lây lan một cách hiệu quả)
  • gì chỉ số bạn sẽ cần
  • Các mẫu ghi bạn sẽ sử dụng

Kho dữ liệu của GAE tự động hủy chuẩn hóa dữ liệu của bạn. Tức là, mỗi chỉ mục chứa một bản sao dữ liệu (chủ yếu) hoàn chỉnh, và do đó mọi chỉ mục đều tăng đáng kể thời gian thực hiện để ghi và không gian lưu trữ được sử dụng. Nếu không, trường hợp thiết kế một lược đồ Datastore sẽ có nhiều công việc hơn: Bạn sẽ phải suy nghĩ cẩn thận về khóa chính cho mỗi loại, và xem xét tác động của quyết định của bạn đối với địa phương của dữ liệu. Ví dụ: khi hiển thị bài đăng trên blog, bạn có thể cần phải hiển thị các nhận xét để đi cùng với bài đăng đó, vì vậy, mỗi khóa của nhận xét có thể sẽ bắt đầu bằng khóa của bài đăng được liên kết.

Với kho dữ liệu, đây không phải là vấn đề lớn: Truy vấn bạn sử dụng sẽ trông giống như "Chọn * TỪ nhận xét WHERE post_id = N." (Nếu bạn muốn trang các bình luận, bạn cũng sẽ có một mệnh đề giới hạn, và hậu tố có thể có của "AND comment_id> last_comment_id".) Một khi bạn thêm một truy vấn như vậy, Datastore sẽ xây dựng chỉ mục cho bạn, và các lần đọc của bạn sẽ kỳ diệu nhanh. Điều cần lưu ý là mỗi chỉ mục bổ sung tạo thêm một số chi phí: tốt nhất là bạn có thể sử dụng ít mẫu truy cập nhất có thể, vì nó sẽ giảm số lượng chỉ mục mà GAE sẽ xây dựng và do đó tổng dung lượng lưu trữ theo yêu cầu của dữ liệu của bạn.

Đọc qua câu trả lời này, tôi thấy nó hơi mơ hồ. Có lẽ một câu hỏi thiết kế thực hành sẽ giúp điều chỉnh phạm vi này? :-)

+1

Kho dữ liệu GAE không "tự động chuẩn hóa dữ liệu của bạn". Nó tự động _indexes_ hầu hết các cột, nhưng đó là hoàn toàn khác nhau. –

+4

Kho dữ liệu cũng không tự động tạo các chỉ mục cho bạn - máy chủ ứng dụng của dev thực hiện. Nếu bạn không thực hiện một truy vấn cụ thể trong dev appserver, thì nó sẽ không thêm mục thích hợp vào indexes.yaml và truy vấn sẽ thất bại khi được triển khai. –

+0

Tôi đã đọc ở đâu đó rằng mỗi chỉ mục chứa một bản sao của các trường _all_ sẽ được trả lại; tuy nhiên, các tài liệu hiện chỉ ra rằng chỉ những cột có ảnh hưởng đến chỉ mục được lưu trữ bên trong nó. AFAICT không có nơi nào nêu rõ nếu chỉ mục đọc là quét đơn giản hoặc quét tìm kiếm. Bạn đã thấy gì về điều đó chưa? – 0124816

-2

Khi GAE xây dựng cách dữ liệu được quản lý ở Django, có rất nhiều thông tin về cách giải quyết các câu hỏi tương tự trong tài liệu Django (ví dụ: xem here, cuộn xuống 'Mô hình đầu tiên của bạn').

Tóm lại, bạn thiết kế mô hình db của bạn làm mô hình đối tượng thông thường và để GAE phân loại tất cả ánh xạ đối tượng-quan hệ.

+0

lời khuyên rất xấu ... Django chỉ hoạt động trên cơ sở dữ liệu quan hệ. Nếu bạn muốn xem một số thực hành có một djano-nonrel mà có thể cung cấp nguồn cảm hứng ... –

1

Bạn có thể sử dụng www.web2py.com. Bạn xây dựng mô hình và ứng dụng một lần và nó hoạt động trên GAE mà còn hoạt động với SQLite, MySQL, Posgres, Oracle, MSSQL, FireBird

+1

Điều đó chỉ đúng về mặt kỹ thuật. Một cơ sở dữ liệu quan hệ dựa trên lược đồ thường xuyên có thể hoạt động trên GAE khi bạn loại bỏ các OR và JOIN. Nhưng nó rất xa được thiết kế để phù hợp với GAE và do đó là khôn ngoan khác ... –

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