2009-12-26 34 views
25

Chúng ta đều biết rằng đối với cơ sở dữ liệu quan hệ, cách tốt nhất là sử dụng ID số cho khóa chính.Phương pháp hay nhất khi tạo ID tài liệu trong couchdb là gì?

Trong couchdb ID mặc định được tạo là UUID. Tốt nhất là nên gắn bó với giá trị mặc định hoặc sử dụng số nhận dạng dễ nhớ sẽ được người dùng sử dụng trong ứng dụng?

Ví dụ: nếu bạn đang thiết kế cơ sở dữ liệu stackoverflow.com trong couchdb, bạn có sử dụng câu hỏi slug (ví dụ: cái gì là tốt nhất-thực hành-khi-tạo-tài liệu-id-in-couchdb) hay một UUID cho mỗi tài liệu?

Trả lời

18

Tôi không phải là chuyên gia về couchdb, nhưng sau khi thực hiện một nghiên cứu nhỏ, đây là những gì tôi đã tìm thấy.

Câu trả lời đơn giản là sử dụng UUID trừ khi bạn có lý do chính đáng.

Câu trả lời còn là, nó phụ thuộc vào:

Chi phí của việc thay đổi ID Vs Làm thế nào có khả năng ID là thay đổi

chi phí thấp thay đổi và khả năng thay đổi ID

Một ví dụ trong số này có thể là một blog có thiết kế không chuẩn hóa như jchris' blog (sofa code available on git hub).

Mỗi lần một trang web khác liên kết đến bài đăng blog, đây là một tham chiếu khác cho id, vì vậy chi phí thay đổi id tăng.

chi phí cao của việc thay đổi ID và ID đó sẽ không bao giờ thay đổi

Một ví dụ của việc này là bất kỳ thiết kế DB đó là rất bình thường mà sử dụng ID auto-increment. Stackoverflow.com là một ví dụ tốt với ID câu hỏi tự động gia tăng mà bạn thấy trong mọi URL. Chi phí thay đổi ID là rất cao vì mỗi khóa ngoại sẽ cần được cập nhật.

Có bao nhiêu tham chiếu hoặc "khóa ngoại" (trong ngôn ngữ DB quan hệ) sẽ có id?

Bất kỳ "khóa ngoại" nào sẽ làm tăng đáng kể chi phí thay đổi ID. Phải cập nhật các tài liệu khác là một hoạt động chậm và chắc chắn nên tránh.

ID có thể thay đổi như thế nào?

Nếu bạn không muốn sử dụng UUID, có thể bạn đã có ý tưởng về ID nào bạn muốn sử dụng.

Nếu có khả năng thay đổi, chi phí thay đổi ID phải thấp. Nếu không, hãy chọn một ID khác.

Động lực của bạn khi muốn sử dụng ID dễ nhớ là gì?

Đừng nói hiệu suất.

Benchmarks show rằng "tra cứu chính của chế độ xem CouchDB gần như, nhưng không hoàn toàn, nhanh như tra cứu tài liệu trực tiếp". Điều này có nghĩa là phải tìm kiếm để tìm một bản ghi không phải là vấn đề lớn. Không chọn id thân thiện chỉ vì bạn có thể thực hiện tra cứu trực tiếp trên tài liệu.

Bạn sẽ thực hiện nhiều thao tác chèn hàng loạt?

Nếu vậy, tốt hơn nên sử dụng UUID gia tăng để có hiệu suất tốt hơn.

Xem điều này post về chèn số lượng lớn. Damien Katz bình luận và nói:

"Nếu bạn muốn có nhanh nhất lần chèn có thể, bạn nên cung cấp cho giá trị tăng dần của _id, do đó, có một UUID và tăng nó bằng 1, như vậy nó luôn luôn chèn vào cùng một địa chỉ trong chỉ mục và được lưu vào bộ nhớ cache thân thiện khi bạn đang xử lý các tệp lớn hơn RAM.Để dễ dàng hơn cách thực hiện tương tự, chỉ cần liên tục ghi số tài liệu đó là . đệm như vậy mà chúng sắp xếp chính xác, "0000001" thay vì "1" chẳng hạn. "

+5

Câu trả lời này dường như được soạn trên quan điểm cho rằng cuộc xung đột tránh phải lúc nào cũng mong muốn; tuy nhiên, đôi khi xung đột là một phần tự nhiên của miền vấn đề và thay vì chỉ đơn giản là tránh được, chúng phải chủ động được phát hiện và giải quyết. Trong những trường hợp như vậy, ID tự nhiên là một lựa chọn tuyệt vời. Ví dụ: không sử dụng tiêu đề của bài đăng trên blog làm ID trên hệ thống nhiều người dùng, nhưng hãy sử dụng tên miền và địa chỉ IP đầy đủ khi lập mô hình bản ghi địa chỉ DNS. – user359996

+1

Bài viết này giải thích rõ tác động của UUID ngẫu nhiên lên hiệu suất của CouchDB http://blog.inoi.fi/2010/11/impact-of-document-ids-on-performance.html – Lebugg

+1

Có sử dụng CouchDB trong nhiều nguồn mở và thương mại khác nhau dự án, tôi hoàn toàn không đồng ý với câu trả lời này. Nó hoàn toàn bỏ qua cách ID hoạt động trong Couch (không thay đổi, được sử dụng để phân loại, phải là duy nhất trên toàn bộ DB, ý nghĩa cho sao chép, v.v.). – theDmi

-1

Khóa chính trong DB không bao giờ có bất kỳ "ý nghĩa" nào ngoại trừ có thể mã hóa chuỗi. Bạn có thể muốn thay đổi SLUG nhưng không thay đổi khóa chính.

Có thể có một đối số tốt để sử dụng thứ gì đó bắt đầu bằng dấu thời gian để có thứ tự vốn có trong khóa của bạn. Tôi thường sử dụng "% f @% s"% (thời gian(), tên máy chủ()) để nhận các lệnh, khóa duy nhất. (Điều này chỉ hoạt động nếu thời gian của bạn() thực hiện không bao giờ trả về cùng một giá trị hai lần.)

Đối với các nội dung khác (ví dụ: hình ảnh), nơi tôi muốn tránh trùng lặp Tôi thường sử dụng sha (dữ liệu) làm khóa.

0

Các _id được sử dụng rất nhiều trong internals CouchDB và bất kỳ chi phí băm thêm sẽ làm chậm một bó của internals vì vậy tốt nhất để gắn bó với UUID cung cấp.

+4

Tôi đang bối rối. Bạn có ý nghĩa gì bởi "chi phí băm thừa"? Bạn đang nói một ID do người dùng tạo sẽ kết thúc băm, nội bộ, trong khi UUID được tạo tự động sẽ không? – user359996

+0

Có thể đề cập đến độ dài của _id (chi phí cao hơn để băm chuỗi dài hơn)? – Nevir

2

Tôi nhận thấy đây là câu hỏi được trả lời từ lâu, nhưng có một xem xét quan trọng khác cho những người phát hiện sự cố. Khi một tài liệu bị xóa, tất cả những gì bạn biết về nó là id. Gõ, cho dù rõ ràng (type:foo) hoặc ngụ ý (gõ vịt) không hoạt động. Vì vậy, bạn không thể đăng ký thay đổi cho doc.deleted===true && doc.type==foo, bởi vì sau khi xóa, doc.type===undefined. Giá trị _id mà bạn có thể giải mã hậu-hoc là hữu ích, đặc biệt nếu mã máy khách của bạn cần phải có trạng thái không quốc tịch (và do đó không thể lưu trữ danh sách _id s theo loại).

+0

Tôi nhận ra đây là một câu trả lời cũ, nhưng bạn có thể giải quyết vấn đề đó, thay vì phát hành DELETE trên tài liệu, cập nhật tài liệu với một trường '" _deleted ": true' trong thư mục gốc. Tuy nhiên, việc đảm bảo mã của bạn chỉ sử dụng chiến lược này có thể sẽ gây đau đớn và dễ bị lỗi. – dhasenan

0

Bạn có thể đi với CouchDB id mặc định (UUID), vì nó nói trong documentation những lý do chính để sử dụng UUID mặc định như sau:

  • UUIDs là những con số ngẫu nhiên mà có như vậy một xác suất va chạm thấp rằng mọi người có thể kiếm hàng ngàn UUID một phút trong hàng triệu năm mà không bao giờ tạo ra một bản sao. Đây là một cách tuyệt vời để đảm bảo hai người độc lập không thể tạo hai tài liệu khác nhau với cùng một ID.
  • Sao chép CouchDB cho phép bạn chia sẻ tài liệu với người khác và sử dụng UUID đảm bảo rằng tất cả đều hoạt động.

Bây giờ, Mặt khác, Nếu bạn dựa trên máy chủ (CouchDB) để tạo ra các UUID và bạn sẽ chỉ làm cho hai yêu cầu POST vì yêu cầu POST đầu tiên ném bom ra, bạn có thể tạo ra hai tài liệu và không bao giờ tìm thấy về cái đầu tiên bởi vì chỉ có cái thứ hai sẽ được báo cáo lại, do đó, bạn nên tạo UUID của riêng mình để đảm bảo rằng bạn sẽ không bao giờ kết thúc với tài liệu trùng lặp, nhưng chắc chắn tôi sẽ đi với UUID trừ khi bạn đặc biệt cần khác. documenta.

4

Xuất phát từ quan điểm cơ sở dữ liệu quan hệ, tôi mất một lúc để tìm ra couchdb. Nhưng sự thật là ngược lại với câu trả lời chấp nhận;

Thay vì sử dụng uuid mặc định, việc tạo id thông minh có thể hỗ trợ bạn trong việc truy xuất và sắp xếp dữ liệu.

Giả sử bạn có một bộ phim cơ sở dữ liệu. Tất cả các tài liệu có thể được tìm thấy ở đâu đó dưới URL/phim, nhưng chính xác ở đâu?

Nếu bạn lưu trữ một tài liệu với _id Jabberwocky ({"_id": "Jabberwocky"}) vào cơ sở dữ liệu phim của bạn, nó sẽ có sẵn dưới URL/phim/Jabberwocky. Vì vậy, nếu bạn gửi yêu cầu GET tới/movies/Jabberwocky, bạn sẽ lấy lại JSON tạo nên tài liệu của bạn ({"_id": "Jabberwocky"}).

http://guide.couchdb.org/draft/documents.html

mũi Hiệu suất: nếu bạn chỉ sử dụng ID tài liệu một cách ngẫu nhiên tạo ra, sau đó bạn không chỉ bỏ lỡ một cơ hội để có được một chỉ số miễn phí - bạn cũng đang phát sinh chi phí xây dựng chỉ mục mà bạn sẽ không bao giờ sử dụng. Vì vậy, sử dụng và lạm dụng ID tài liệu của bạn!

https://pouchdb.com/2014/05/01/secondary-indexes-have-landed-in-pouchdb.html

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