Phát triển Java 2.0: NoSQL
ô hình hóa d liu Schemaless vi Bigtable Gaelyk ca Groovy
Kho dliệu NoSQL cũng giống như Bigtable và CouchDB là đều chuyển lên trọng
m trong thời đại Web 2.0 bởi vì chúng có thgiải quyết các vấn đề mở rộng trên
một quy mô lớn. Google và Facebook hai trong số những tên tuổi ln đã sdụng
NoSQL, và kể cả chúngi na. Kho dữ liệu Schemaless về cơ bản khác với cơ sở
dliu quan hệ truyền thống, nhưng việc tận dụng chúng dễ dàng hơn bạn nghĩ,
đặc biệt là nếu bạn bắt đầu với mô hình min domain chứ không phải là một quan
hệ.
Cơ s d liu quan h đã thng tr lưu tr d liu hơn 30 năm, nhưng vic cơ s d
liu schemaless (hay NoSQL) ngày càng ph biến đã cho thy rằng điều này đang
dần thay đổi. Trong khi các h qun tr cơ s d liu (RDBMS) cung cp mt nn
tng vng chắc để lưu tr d liu trong kiến trúc client-server truyn thng, nhưng
nó không dng (hay tn ít chi phí) để m rng. Trong thời đại mà các ng dng
web có th co giãn được như Facebook, Twitter thì điều này qu thc mt hn
chế đáng tiếc.
Trong khi lựa chọn cơ sở dữ liệu quan hệ trước đó (bạn còn nhớ về cơ sdữ liệu
hướng đối tượng chứ?) đã thất bại trong việc giải quyết các vấn đề cấp bách, thì
các cơ sở dữ liệu NoSQL như Bigtable của Google hay SimpleDB của Amazon đã
xuất hiện như một câu trả lời cho nhu cầu co giãn cao của các ứng dụng Web. Về
bản chất, NoSQLthể là gii pháp cho các vấn đề khó khăn một trong các quá
trình tiến hóa của ứng dụng Web không hơn không kém, nó cũng giống như việc
tiến hóa tất yếu lên Web 2.0 vậy.
NoSQL: Mt li tư duy mi?
Khi các nhà phát trin bàn về cơ sở dữ liệu không-quan-hhay NoSQL, thì điều
đầu tiên họ thường nhắc đến là việc phải thay đổi lối tư duy. Theo tôi, thực ra
điều đó còn tùy vào cách tiếp cận ban đầu của bạn về mô hình hóa dliu. Nếu bạn
đã quen với việc thiết kếng dụng theo cách mô hình hóa cu trúc cơ sở dữ liệu
trước (có nghĩa là bn phi tìm ra các bảng và các mối quan hệ của chúng trước),
sau đó việc hình hóa dliệu với kho lưu trữ schemaless như Bigtable sẽ yêu
cầu bạn phải xem xét lại cách làm. Tuy nhiên, nếu bạn bắt đầu thiết kế ứng dụng
với mô hình miền domain thì s cảm thấy phù hợp hơn với cấu trúc schemaless của
Bigtable.
Kho d liu không-quan-h không có các bng hay khóa chính, hay thm clà các
khóa ngoi (mc dù c hai loi khóa này đều hin din trong mt dng ni lng).
Vì thế bn s tht vng nếu c gng áp dng mô hình hóa quan h nhưnn tng
cho mô hình hóa d liu trong cơ s d liu NoSQL. Bắt đầu t mt mô hình min
domain giúp đơn gin hóa nhiu th; trong thc tế, tôi đã thy s linh hot ca cu
trúc schemaless dưới mô hình min domain chính là kh năng làm mi.
Sự phức tạp của việc chuyển từ một mô hình dữ liệu quan hệ đến một mô hình d
liu schemaless phụ thuộc vào cách tiếp cận của bạn: đó là bn bắt đầu từ một quan
hệ hay một thiết kế dựa trên min domain. Khi bạn di chuyển sang kho dữ liệu như
CouchDB hoặc Bigtable, bạn sẽ thật s loại bỏ được những hạn chế của nn tảng
lâu đời như Hibernate (ít nhất là từ bây giờ). Mặt khác, hiu ứng green-pasture s
giúp bạn txây dựng nó. Và trong bài này, bạn sẽ tìm hiu sâu về kho dữ liu
schemaless.
Các thc th và mi quan h
Một kho dữ liệu schemaless cung cấp cho bạn sự linh hoạt để thiết kế mô hình
min domain với các đối tượng đầu tiên (một thứ gì đó mới hơn, các framework
như Grails tạo thuận lợi một cách tự động). Công việc của bạn là tiến về phía trước
sau đó map miền domain của bạn với kho dữ liệu, điu này rất đễng đối với
Google App Engine.
Trong bài "Phát trin Java 2.0: Gaelyk cho Google App Engine," tôi đã gii thiệu
về Gaelyk, một framework dựa trên Groovy giúp làm việc với kho dữ liệu của
Google. Phần ln bài viết tập trung vào việc thúc đẩy các đối tượng Google Entity.
Ví dụ sau đây (trích từ bài viết đó) cho thấy cách các thực thể đối tượng làm việc
trong Gaelyk.
Liệt kê 1. Gán đối tượng vào thc th
def ticket = new Entity("ticket")
ticket.officer = params.officer
ticket.license = params.plate
ticket.issuseDate = offensedate
ticket.location = params.location
ticket.notes = params.notes
ticket.offense = params.offense
Thiết kế bởi đối tượng
Các mô hình đối tượng trong thiết kế sở dữ liu cho thấy trong khuôn khổ ứng
dụng Web hiện đại như Grails và Ruby on Rails, nhấn mnh việc thiết kế mô hình
đối tượng và xviệc tạo giản đồ cơ sở dữ liệu cho bạn.
Phương pháp này phản đối các tiến trình dai dng, nhưng ta sẽ dễ dàng thy nó trở
nên tnhạt nếu bạn sử dụng nhiếu thực thể ví dụ, nếu bạn đã to ra (hay tìm
kiếm) chúng trong các servlet khác nhau. Một servlet (hay Groovlet) xử lý các
nhim vụ của bạn có thể loại bỏ đi một số gánh nặng. Một lựa chọn tự nhiên hơn
như tôi sẽ chứng minh — sẽ là một mô hình đối tượng Ticket.