2010-05-05 26 views
9

Tôi đang cố gắng để xây dựng hệ thống web nhỏ (url shortcutting) bằng cách sử dụng nonsql Cassandra DB, vấn đề tôi stack là id auto generation.id autoincrement/thi đua chuỗi với CassandraDB/MongoDB vv

Có ai đó đã xếp chồng với vấn đề này không?

Cảm ơn.

P.S. UUID không hoạt động đối với tôi, tôi cần sử dụng TẤT CẢ các số từ 0 đến Long.MAX_VALUE (java). vì vậy tôi cần một cái gì đó mà chính xác hoạt động như sql chuỗi

CẬP NHẬT:

Lý do tại sao tôi không ok với id GUID là bên trong phạm vi ứng dụng của tôi.

Ứng dụng của tôi có phần rút gọn url và tôi cần tạo url càng ngắn càng tốt. Vì vậy, tôi làm theo cách tiếp cận tiếp theo: Tôi lấy số bắt đầu từ 0 và chuyển đổi chuỗi base64. Vì vậy, trong kết quả tôi có url như mysite.com/QA (trong đó QA là chuỗi 64 cơ sở). Điều này là rất dễ thực hiện bằng cách sử dụng SQL DB, tôi chỉ lấy ID tăng tự động, chuyển đổi nó thành URL và chắc chắn là 100 phần trăm, URL đó là duy nhất.

+0

Vui lòng giải thích chi tiết hơn lý do tại sao UUID không thể được sử dụng và lý do bạn phải sử dụng cơ sở dữ liệu nonsql. Có lẽ chúng ta có thể giải quyết vấn đề của bạn theo cách khác. – Espo

Trả lời

3

autoincrement ID vốn đã không mở rộng quy mô cũng như họ cần một nguồn duy nhất để tạo ra những con số. Đây là lý do tại sao các cơ sở dữ liệu có thể sao chép/sao chép như MongoDB sử dụng lâu hơn, các định danh giống GUID cho các đối tượng. Tại sao bạn cần các giá trị LONG quá nặng?

Bạn có thể làm điều đó bằng cách sử dụng gia số nguyên tử, giữ lại giá trị cũ, nhưng tôi không chắc chắn. Điều này sẽ chỉ giới hạn ở các thiết lập máy chủ đơn lẻ.

+0

Cảm ơn sự hiểu biết tốt về nguồn vấn đề của tôi. Vui lòng xem mô tả câu hỏi được cập nhật, cảm ơn – abovesun

+0

Họ có phải liên tục không? Điều gì về "chọn một số ngẫu nhiên trong 1.MAX (LONG) và chèn". Đảm bảo trường có chỉ mục duy nhất. Nếu chèn không thành công, hãy thử lại với một giá trị ngẫu nhiên khác. Đây là nguyên tử và an toàn. Và khá hiệu quả miễn là kích thước DB của bạn không đến gần 2^31 :) – wump

+0

Vâng, có lẽ cách tiếp cận này không quá tệ đối với tôi, nói đúng là tôi không chắc chắn rằng Cassandra có tương tự với ràng buộc duy nhất của SQL, ít nhất là tôi không tìm thấy cách mô phỏng nó. Nhưng tôi đã không cố gắng hết sức :) – abovesun

-1

Tôi không chắc chắn sẽ theo bạn. Ngôn ngữ của bạn đang sử dụng là gì? Chúng ta đang nói về uuid?

Sau đây là cách bạn tạo UUIDs trong một số ngôn ngữ:

java.util.UUID.randomUUID(); // (Java) variant 2, version 4 

import uuid // (Python) 
uuid.uuid1() // version 1 
+0

UUID không hoạt động đối với tôi, tôi cần sử dụng TẤT CẢ số từ 0 đến Long.MAX_VALUE (java). vì vậy tôi cần một cái gì đó mà chính xác hoạt động như chuỗi sql – abovesun

4

Không biết về Cassandra, nhưng với mongo bạn có thể có một chuỗi nguyên tử (nó sẽ không mở rộng, nhưng sẽ hoạt động theo cách cần thiết, ngay cả trong môi trường bị phân đoạn nếu truy vấn có trường bị phân đoạn).

Có thể thực hiện bằng cách sử dụng lệnh findandmodify.

Hãy xem xét chúng ta có một bộ sưu tập đặc biệt có tên sequences và chúng tôi muốn có một chuỗi cho bài số (tên postid), bạn có thể sử dụng mã tương tự như sau:

 
> db.runCommand({ "findandmodify" : "sequences", 
        "query" : { "name" : "postid"}, 
        "update" : { $inc : { "id" : 1 }}, 
        "new" : true }); 

Lệnh này sẽ trả lại nguyên tử được cập nhật (new) tài liệu cùng với trạng thái. Trường value chứa tài liệu trả về nếu lệnh đã hoàn tất thành công.

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