Tôi có một câu hỏi mà tôi đã cố gắng trả lời một thời gian nhưng không thể tìm ra:
Bạn thiết kế hoặc phân chia tài liệu CouchDB như thế nào?
Lấy một bài đăng trên blog làm ví dụ.
Cách bán "quan hệ" sẽ là tạo một vài đối tượng:
- Bài đăng
- Người sử dụng
- Bình luận
- Nhãn
- Đoạn trích
Điều này rất có ý nghĩa. Nhưng tôi đang cố gắng sử dụng couchdb (vì tất cả các lý do là nó tuyệt vời) để tạo mô hình tương tự và điều đó cực kỳ khó khăn.
Hầu hết các bài đăng trên blog đều cung cấp cho bạn một ví dụ dễ dàng về cách thực hiện điều này. Về cơ bản họ phân chia nó theo cùng một cách, nhưng nói rằng bạn có thể thêm các thuộc tính 'tùy ý' vào mỗi tài liệu, điều này chắc chắn rất hay. Vì vậy, bạn sẽ có một cái gì đó như thế này trong CouchDB:
- Đăng (với các thẻ và đoạn mã mô hình "giả" trong tài liệu)
- Bình luận
- Người sử dụng
Một số người thậm chí sẽ nói rằng bạn có thể ném Nhận xét và Người dùng vào đó, vì vậy bạn sẽ có điều này:
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author: {
name: "Lance"
age: "23"
}
tags: ["sample", "post"]
comments {
comment {
id: 93930414809
body: "Interesting Post"
}
comment {
id: 19018301989
body: "I agree"
}
}
}
Điều đó trông rất đẹp và dễ hiểu. Tôi cũng hiểu cách bạn có thể viết các dạng xem chỉ trích xuất Nhận xét từ tất cả các tài liệu Bài đăng của bạn, để đưa chúng vào các mô hình Nhận xét, giống với Người dùng và Thẻ.
Nhưng sau đó tôi nghĩ, "tại sao không chỉ đặt toàn bộ trang web của tôi vào một tài liệu duy nhất?":
site {
domain: "www.blog.com"
owner: "me"
pages {
page {
title: "Blog"
posts {
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author: {
name: "Lance"
age: "23"
}
tags: ["sample", "post"]
comments {
comment {
id: 93930414809
body: "Interesting Post"
}
comment {
id: 19018301989
body: "I agree"
}
}
}
post {
id: 18091890192984
title: "Second Post"
...
}
}
}
}
}
Bạn có thể dễ dàng thực hiện các lượt xem để tìm những gì bạn muốn với điều đó.
Sau đó, câu hỏi tôi có là, làm thế nào để bạn xác định khi nào để chia tài liệu thành các tài liệu nhỏ hơn, hoặc khi nào tạo "MỐI QUAN HỆ" giữa các tài liệu?
Tôi nghĩ rằng nó sẽ "Hướng đối tượng" hơn nhiều và dễ ánh xạ tới Đối tượng giá trị hơn, nếu nó được phân chia như vậy:
posts {
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author_id: "Lance1231"
tags: ["sample", "post"]
}
}
authors {
author {
id: "Lance1231"
name: "Lance"
age: "23"
}
}
comments {
comment {
id: "comment1"
body: "Interesting Post"
post_id: 123412804910820
}
comment {
id: "comment2"
body: "I agree"
post_id: 123412804910820
}
}
... nhưng sau đó nó bắt đầu trông giống Cơ sở dữ liệu quan hệ hơn. Và thường thì tôi kế thừa một thứ gì đó trông giống như "toàn bộ trang web trong một tài liệu", vì vậy việc mô hình hóa nó bằng các quan hệ sẽ khó hơn.
Tôi đã đọc rất nhiều điều về cách / khi nào sử dụng Cơ sở dữ liệu quan hệ so với Cơ sở dữ liệu tài liệu, vì vậy đó không phải là vấn đề chính ở đây. Tôi chỉ đang tự hỏi, đâu là quy tắc / nguyên tắc tốt để áp dụng khi lập mô hình dữ liệu trong CouchDB.
Một ví dụ khác là với các tệp / dữ liệu XML. Một số dữ liệu XML có độ sâu hơn 10 cấp lồng nhau và tôi muốn hình dung rằng bằng cách sử dụng cùng một ứng dụng khách (ví dụ: Ajax trên Rails hoặc Flex) mà tôi sẽ kết xuất JSON từ ActiveRecord, CouchRest hoặc bất kỳ Trình lập bản đồ quan hệ đối tượng nào khác. Đôi khi tôi nhận được các tệp XML khổng lồ là toàn bộ cấu trúc trang web, như hình dưới đây và tôi cần ánh xạ nó thành Đối tượng giá trị để sử dụng trong ứng dụng Rails của mình để tôi không phải viết một cách khác để tuần tự hóa / giải mã dữ liệu :
<pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages>
Vì vậy, các câu hỏi chung của CouchDB là:
- Bạn sử dụng các quy tắc / nguyên tắc nào để phân chia các tài liệu của mình (các mối quan hệ, v.v.)?
- Có ổn không khi đặt toàn bộ trang web vào một tài liệu?
- Nếu vậy, làm cách nào để xử lý việc tuần tự hóa / giải mã hóa tài liệu với các mức độ sâu tùy ý (như ví dụ json lớn ở trên hoặc ví dụ xml)?
- Hoặc bạn không biến chúng thành VO, bạn chỉ quyết định "những cái này quá lồng vào Bản đồ quan hệ đối tượng, vì vậy tôi sẽ chỉ truy cập chúng bằng các phương thức XML / JSON thô"?
Cảm ơn sự giúp đỡ của bạn rất nhiều, vấn đề làm thế nào để phân chia dữ liệu của bạn với CouchDB đã khó đối với tôi để nói "đây là cách tôi nên làm điều đó từ bây giờ". Tôi hy vọng sẽ sớm đạt được điều đó.
Tôi đã nghiên cứu các trang web / dự án sau đây.
- Dữ liệu phân cấp trong CouchDB
- CouchDB Wiki
- Sofa - Ứng dụng CouchDB
- CouchDB Hướng dẫn cuối cùng
- PeepCode CouchDB Screencast
- CouchRest
- CouchDB README
... nhưng họ vẫn chưa trả lời câu hỏi này.