Làm thế nào để suy nghĩ trong các cửa hàng dữ liệu thay vì cơ sở dữ liệu?


183

Ví dụ: Google App Engine sử dụng Google Datastore, không phải cơ sở dữ liệu tiêu chuẩn, để lưu trữ dữ liệu. Có ai có bất kỳ lời khuyên cho việc sử dụng Google Datastore thay vì cơ sở dữ liệu không? Dường như tôi đã rèn luyện trí óc của mình để suy nghĩ 100% trong các mối quan hệ đối tượng ánh xạ trực tiếp đến các cấu trúc bảng và bây giờ thật khó để nhìn thấy bất cứ điều gì khác biệt. Tôi có thể hiểu một số lợi ích của Google Datastore (ví dụ: hiệu suất và khả năng phân phối dữ liệu), nhưng một số chức năng cơ sở dữ liệu tốt đã bị hy sinh (ví dụ: tham gia).

Có ai đã làm việc với Google Datastore hoặc BigTable có lời khuyên tốt nào để làm việc với họ không?


DataSource là một api cũ mà chúng tôi đang dần loại bỏ - nó rất gắn liền với mô hình kết nối cơ sở dữ liệu. DataStore là api cấp thấp cho phép truy cập vào cách tiếp cận dựa trên luồng "thô" đối với nội dung GIS, sử dụng FeatureReaders và FeatureWriter.
Murali

Bây giờ Google Cloud SQL cung cấp hỗ trợ cơ sở dữ liệu quan hệ cho Google App Engine. Nếu bạn vẫn tìm giải pháp cho các cửa hàng dữ liệu, bạn có thể sử dụng Google Cloud SQL .
Chandana

Bạn có thể muốn kiểm tra API Mungo Datastore: bit.ly/13eSDpr
quark

Câu trả lời:


149

Có hai điều chính để làm quen với kho dữ liệu của Máy ứng dụng khi so sánh với cơ sở dữ liệu quan hệ 'truyền thống':

  • Kho dữ liệu không phân biệt giữa chèn và cập nhật. Khi bạn gọi put () trên một thực thể, thực thể đó sẽ được lưu trữ vào kho dữ liệu bằng khóa duy nhất của nó và bất cứ thứ gì có khóa đó đều bị ghi đè. Về cơ bản, mỗi loại thực thể trong kho dữ liệu hoạt động như một bản đồ khổng lồ hoặc danh sách được sắp xếp.
  • Truy vấn, như bạn đã đề cập, hạn chế hơn nhiều. Không tham gia, để bắt đầu.

Điều quan trọng để nhận ra - và lý do đằng sau cả hai sự khác biệt này - là về cơ bản Bigtable hoạt động giống như một cuốn từ điển được đặt hàng khổng lồ. Do đó, một thao tác đặt chỉ đặt giá trị cho một khóa nhất định - bất kể giá trị nào trước đó cho khóa đó và các hoạt động tìm nạp bị giới hạn trong việc tìm nạp các khóa đơn hoặc phạm vi khóa liền kề. Các truy vấn tinh vi hơn được thực hiện với các chỉ mục, về cơ bản chỉ là các bảng của riêng chúng, cho phép bạn thực hiện các truy vấn phức tạp hơn khi quét trên các phạm vi liền kề.

Khi bạn đã tiếp thu điều đó, bạn có kiến ​​thức cơ bản cần thiết để hiểu các khả năng và giới hạn của kho dữ liệu. Những hạn chế có vẻ như tùy tiện có lẽ có ý nghĩa hơn.

Điều quan trọng ở đây là mặc dù đây là những hạn chế đối với những gì bạn có thể làm trong cơ sở dữ liệu quan hệ, nhưng những hạn chế tương tự này là điều khiến nó trở nên thiết thực để mở rộng đến mức độ mà Bigtable được thiết kế để xử lý. Bạn chỉ đơn giản là không thể thực hiện loại truy vấn có vẻ tốt trên giấy nhưng cực kỳ chậm trong cơ sở dữ liệu SQL.

Về cách thay đổi cách bạn thể hiện dữ liệu, điều quan trọng nhất là tính toán trước. Thay vì thực hiện tham gia tại thời điểm truy vấn, hãy tính toán trước dữ liệu và lưu trữ nó trong kho dữ liệu bất cứ khi nào có thể. Nếu bạn muốn chọn một bản ghi ngẫu nhiên, hãy tạo một số ngẫu nhiên và lưu nó với mỗi bản ghi. Có cả một cuốn sách dạy nấu ăn về những mẹo và thủ thuật này ở đây Chỉnh sửa: Cuốn sách nấu ăn không còn tồn tại.


4
Tin tốt, internet đã không quên về sách dạy nấu ăn, cụ thể là kho lưu trữ internet đã không quên. Ma của trang web vẫn còn tồn tại ở đây: web.archive.org/web/20090416113704/http://...
EasilyBaffled

42

Cách tôi đã đi về chuyển đổi tâm trí là quên hoàn toàn cơ sở dữ liệu.

Trong thế giới db quan hệ, bạn luôn phải lo lắng về việc chuẩn hóa dữ liệu và cấu trúc bảng của mình. Bỏ tất cả. Chỉ cần bố trí trang web của bạn. Đặt tất cả chúng ra. Bây giờ hãy nhìn họ. Bạn đã 2/3 ở đó.

Nếu bạn quên khái niệm rằng vấn đề kích thước cơ sở dữ liệu và dữ liệu không nên bị trùng lặp thì bạn 3/4 ở đó và bạn thậm chí không phải viết bất kỳ mã nào! Hãy để quan điểm của bạn ra lệnh cho Mô hình của bạn. Bạn không cần phải lấy đồ vật của mình và biến chúng thành 2 chiều nữa như trong thế giới quan hệ. Bạn có thể lưu trữ các đối tượng với hình dạng bây giờ.

Vâng, đây là một lời giải thích đơn giản về thử thách, nhưng nó giúp tôi quên đi cơ sở dữ liệu và chỉ làm một ứng dụng. Tôi đã thực hiện 4 ứng dụng App Engine cho đến nay bằng cách sử dụng triết lý này và còn nhiều thứ nữa sẽ đến.


2
Tôi thích "Hãy để quan điểm của bạn ra lệnh cho Mô hình của bạn." bit Tôi nghĩ rằng đó là một cúp máy đến từ RDBMS, nhưng nó đơn giản hóa mọi thứ.
cbednarski

23

Tôi luôn cười thầm khi mọi người đi ra - nó không liên quan. Tôi đã viết cellectr trong django và đây là một đoạn mô hình của tôi dưới đây. Như bạn sẽ thấy, tôi có những giải đấu được quản lý hoặc huấn luyện bởi người dùng. Tôi có thể từ một giải đấu có được tất cả các nhà quản lý, hoặc từ một người dùng nhất định Tôi có thể trả lại giải đấu mà cô ấy huấn luyện hoặc quản lý.

Chỉ vì không có hỗ trợ khóa ngoại cụ thể không có nghĩa là bạn không thể có mô hình cơ sở dữ liệu với các mối quan hệ.

Hai xu của tôi.


class League(BaseModel):
    name = db.StringProperty()    
    managers = db.ListProperty(db.Key) #all the users who can view/edit this league
    coaches = db.ListProperty(db.Key) #all the users who are able to view this league

    def get_managers(self):
        # This returns the models themselves, not just the keys that are stored in teams
        return UserPrefs.get(self.managers)

    def get_coaches(self):
        # This returns the models themselves, not just the keys that are stored in teams
        return UserPrefs.get(self.coaches)      

    def __str__(self):
        return self.name

    # Need to delete all the associated games, teams and players
    def delete(self):
        for player in self.leagues_players:
            player.delete()
        for game in self.leagues_games:
            game.delete()
        for team in self.leagues_teams:
            team.delete()            
        super(League, self).delete()

class UserPrefs(db.Model):
    user = db.UserProperty()
    league_ref = db.ReferenceProperty(reference_class=League,
                            collection_name='users') #league the users are managing

    def __str__(self):
        return self.user.nickname

    # many-to-many relationship, a user can coach many leagues, a league can be
    # coached by many users
    @property
    def managing(self):
        return League.gql('WHERE managers = :1', self.key())

    @property
    def coaching(self):
        return League.gql('WHERE coaches = :1', self.key())

    # remove all references to me when I'm deleted
    def delete(self):
        for manager in self.managing:
            manager.managers.remove(self.key())
            manager.put()
        for coach in self.managing:
            coach.coaches.remove(self.key())
            coaches.put()            
        super(UserPrefs, self).delete()    

12

Tôi đến từ thế giới cơ sở dữ liệu quan hệ sau đó tôi tìm thấy điều Datastore này. phải mất vài ngày để có được hang của nó. cũng có một số phát hiện của tôi.

Bạn hẳn đã biết rằng Datastore được xây dựng theo tỷ lệ và đó là điều tách biệt nó khỏi RDMBS. để mở rộng quy mô tốt hơn với tập dữ liệu lớn, App Engine đã thực hiện một số thay đổi (một số có nghĩa là rất nhiều thay đổi).


Cấu trúc RDBMS VS DataStore
Trong cơ sở dữ liệu, chúng ta thường cấu trúc dữ liệu của mình trong Bảng, Hàng trong Kho dữ liệu, nó trở thành Loại và Thực thể .

Mối quan hệ
trong RDBMS, hầu hết mọi người theo dõi mối quan hệ Một-Một, Nhiều-Một, Nhiều-Nhiều, Trong Datastore, Vì nó có điều "Không tham gia" nhưng chúng ta vẫn có thể đạt được sự bình thường hóa bằng cách sử dụng " ReferenceProperty " Ví dụ: Ví dụ về mối quan hệ một đối một .

Các chỉ mục
Thông thường trong RDMBS, chúng tôi tạo các chỉ mục như Khóa chính, Khóa ngoài, Khóa duy nhất và Khóa chỉ mục để tăng tốc tìm kiếm và tăng hiệu suất cơ sở dữ liệu của chúng tôi. Trong kho dữ liệu, bạn phải tạo ít nhất một chỉ mục cho mỗi loại (nó sẽ tự động tạo dù bạn có thích hay không) vì kho dữ liệu tìm kiếm thực thể của bạn trên cơ sở các chỉ mục này và tin rằng đó là phần tốt nhất, trong RDBMS bạn có thể tìm kiếm bằng cách sử dụng trường không chỉ mục mặc dù sẽ mất một thời gian nhưng nó sẽ. Trong Datastore bạn không thể tìm kiếm bằng thuộc tính phi chỉ mục.

Đếm
Trong RDMBS, việc đếm (*) dễ dàng hơn nhiều nhưng trong kho dữ liệu, Vui lòng thậm chí không nghĩ nó theo cách thông thường (Vâng có chức năng đếm) vì nó có 1000 Giới hạn và sẽ tốn nhiều thao tác nhỏ như thực thể. không tốt nhưng chúng tôi luôn có những lựa chọn tốt, chúng tôi có thể sử dụng Shard Counters .

Những ràng buộc độc đáo
Trong RDMBS, Chúng tôi yêu thích tính năng này phải không? nhưng Datastore có cách riêng của nó. bạn không thể định nghĩa một thuộc tính là duy nhất :(.

Truy vấn
GAE Datatore cung cấp một tính năng tốt hơn nhiều THÍCH (Ôi không! Kho dữ liệu không có từ khóa THÍCH) SQL là GQL .

Chèn / Cập nhật / Xóa / Chọn dữ liệu
Đây là nơi mà tất cả chúng ta quan tâm, vì trong RDMBS, chúng tôi yêu cầu một truy vấn cho Chèn, Cập nhật, Xóa và Chọn giống như RDBMS, Datastore đã đặt, xóa, lấy (không quá phấn khích) vì Kho dữ liệu đặt hoặc nhận về các điều khoản Viết, Đọc, Hoạt động nhỏ ( Chi phí đọc cho các cuộc gọi kho dữ liệu ) và đó là nơi Mô hình hóa dữ liệu hoạt động. bạn phải giảm thiểu các hoạt động này và giữ cho ứng dụng của bạn chạy. Để giảm thao tác Đọc, bạn có thể sử dụng Memcache .


6

Hãy xem tài liệu Objectify. Bình luận đầu tiên ở cuối trang nói:

"Thật tuyệt, mặc dù bạn đã viết điều này để mô tả Objectify, nhưng đây cũng là một trong những lời giải thích ngắn gọn nhất về kho dữ liệu appengine mà tôi từng đọc. Cảm ơn bạn."

https://github.com/objectify/objectify/wiki/Con chấp nhận


3

Nếu bạn đã từng nghĩ về các thực thể được ánh xạ ORM thì về cơ bản đó là cách một kho dữ liệu dựa trên thực thể như Máy ứng dụng của Google hoạt động. Đối với một cái gì đó như tham gia, bạn có thể nhìn vào các thuộc tính tham chiếu . Bạn không thực sự cần phải quan tâm về việc liệu nó sử dụng BigTable cho phần phụ trợ hay thứ gì khác vì phần phụ trợ được trừu tượng hóa bởi các giao diện API GQL và Datastore.


1
Một vấn đề với các thuộc tính tham chiếu là chúng có thể nhanh chóng tạo ra vấn đề truy vấn 1 + N. (Kéo 1 truy vấn để tìm 100 người, sau đó thực hiện một truy vấn khác cho mỗi người trong số họ để nhận person.address.)
0124816

Liên kết đến 'thuộc tính tham chiếu' bị hỏng, có thể bằng cách thêm hỗ trợ Java. Hãy thử: code.google.com/appengine/docs/python/datastore/ từ
Spike0xff

liên kết cố định. vui lòng chỉnh sửa bất kỳ câu trả lời nếu / khi bạn có đủ đại diện.
Đánh dấu Cidade

0

Cách tôi nhìn vào kho dữ liệu là, loại xác định bảng, mỗi se và thực thể là hàng riêng lẻ trong bảng. Nếu google loại ra ngoài loại chỉ là một bảng lớn không có cấu trúc và bạn có thể kết xuất bất cứ thứ gì bạn muốn trong một thực thể. Nói cách khác, nếu các thực thể không bị ràng buộc với một loại bạn có thể có bất kỳ cấu trúc nào cho một thực thể và lưu trữ ở một vị trí (loại tệp lớn không có cấu trúc với nó, mỗi dòng có cấu trúc riêng).

Bây giờ trở lại nhận xét ban đầu, kho dữ liệu google và bigtable là hai thứ khác nhau, vì vậy đừng nhầm lẫn kho dữ liệu của google với ý nghĩa lưu trữ dữ liệu của kho dữ liệu. Bigtable đắt hơn bigquery (Lý do chính khiến chúng tôi không đồng ý). Bigquery không có các phép nối và RDBMS thích hợp như ngôn ngữ sql và rẻ hơn, tại sao không sử dụng bigquery. Điều đó đang được nói, bigquery có một số hạn chế, tùy thuộc vào kích thước dữ liệu của bạn, bạn có thể hoặc không thể gặp phải chúng.

Ngoài ra, về mặt tư duy về kho dữ liệu, tôi nghĩ rằng tuyên bố đúng sẽ là "suy nghĩ về cơ sở dữ liệu NoQuery". Có quá nhiều trong số chúng hiện có sẵn trong những ngày này nhưng khi nói đến các sản phẩm của Google ngoại trừ google cloud SQL (là myQuery) thì mọi thứ khác là NoQuery.


-6

Bắt nguồn từ thế giới cơ sở dữ liệu, một kho lưu trữ dữ liệu đối với tôi sẽ là một bảng khổng lồ (do đó có tên là "bigtable"). BigTable là một ví dụ tồi mặc dù vì nó thực hiện rất nhiều thứ khác mà cơ sở dữ liệu thông thường có thể không làm được, nhưng nó vẫn là một cơ sở dữ liệu. Có thể trừ khi bạn biết bạn cần xây dựng một cái gì đó như "bigtable" của Google, bạn có thể sẽ ổn với cơ sở dữ liệu tiêu chuẩn. Họ cần điều đó bởi vì họ đang xử lý lượng dữ liệu và hệ thống điên rồ cùng nhau, và không có hệ thống thương mại nào thực sự có thể thực hiện công việc theo cách chính xác mà họ có thể chứng minh rằng họ cần công việc phải hoàn thành.

(tham khảo bigtable: http://en.wikipedia.org/wiki/BigTable )


Câu hỏi liên quan cụ thể đến Google App Engine, sử dụng Bigtable; sử dụng cơ sở dữ liệu quan hệ không phải là một lựa chọn.
Nick Johnson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.