2009-10-29 32 views
5

Tôi hiện đang lập kế hoạch tạo cơ sở dữ liệu lớn (hơn 2 triệu hàng) với nhiều loại dữ liệu từ các nguồn riêng biệt. Tôi muốn tránh việc cấu trúc cơ sở dữ liệu xung quanh id auto_increment để giúp ngăn chặn các vấn đề đồng bộ hóa với bản sao, và cũng vì mỗi mục được chèn sẽ có mã sản phẩm chữ và số được đảm bảo là duy nhất - có vẻ như tôi sử dụng nó hơn.Nhân sư mà không sử dụng id auto_increment

Tôi đang tìm kiếm một công cụ tìm kiếm để lập chỉ mục cơ sở dữ liệu này với Sphinx tìm kiếm khá hấp dẫn do thiết kế của nó xung quanh việc lập chỉ mục cơ sở dữ liệu quan hệ. Tuy nhiên, nhìn vào các hướng dẫn và tài liệu hướng dẫn khác nhau để hiển thị các thiết kế cơ sở dữ liệu phụ thuộc vào trường auto_increment ở dạng này hay dạng khác và thay vào đó là bold statement trong tài liệu nói rằng id tài liệu phải là số nguyên 32/64 bit.

Có cách nào để có cơ sở dữ liệu được Sphinx lập chỉ mục mà không có trường auto_increment làm id không?

Trả lời

3

Nhân sư chỉ yêu cầu id là số nguyên và duy nhất, nó không quan tâm nếu chúng được tự động tăng lên hay không, vì vậy bạn có thể triển khai logic của riêng mình. Ví dụ, tạo băm số nguyên cho các khóa chuỗi của bạn.

+0

tôi là một chút lo lắng về việc có id va chạm với cách tiếp cận đó - hoặc có lẽ tôi đọc bạn sai? – squeeks

+1

Bạn có nên sử dụng unixtime + microtime tại thời điểm chèn không? Sau đó tôi có thể sử dụng nó như thời điểm chèn cũng như id tài liệu, hai con chim với một viên đá. – squeeks

+0

Tôi nghĩ rằng đó sẽ là một ý tưởng tốt đáng để thử. Chúc mừng. – squeeks

1

Nhân sư không phụ thuộc vào tăng tự động, chỉ cần id tài liệu số nguyên duy nhất. Có lẽ bạn có thể có một số nguyên duy nhất thay thế trong bảng để làm việc với nhân sư. Vì nó được biết rằng tìm kiếm số nguyên là cách nhanh hơn so với tìm kiếm chữ và số. BTW bao lâu là mã sản phẩm chữ và số ur? bất kỳ mẫu nào?

+0

Chúng có độ dài khác nhau từ 4 đến 13 ký tự. – squeeks

17

Chắc chắn - thật dễ dàng để làm việc xung quanh. Nếu bạn cần phải tạo nên ID của riêng mình chỉ cho Sphinx và bạn không muốn họ va chạm, bạn có thể làm một cái gì đó như thế này trong sphinx.conf của bạn (ví dụ mã cho MySQL)

source products { 

    # Use a variable to store a throwaway ID value 
    sql_query_pre = SELECT @id := 0 

    # Keep incrementing the throwaway ID. 
    # "code" is present twice because Sphinx does not full-text index attributes 
    sql_query = SELECT @id := @id + 1, code AS code_attr, code, description FROM products 

    # Return the code so that your app will know which records were matched 
    # this will only work in Sphinx 0.9.10 and higher! 
    sql_attr_string = code_attr 
} 

Vấn đề duy nhất là rằng bạn vẫn cần một cách để biết những gì các hồ sơ đã được tìm kiếm của bạn phù hợp. Nhân sư sẽ trả lại id (hiện giờ là vô nghĩa) cộng với bất kỳ cột nào bạn đánh dấu là "thuộc tính".

Nhân sư 0.9.10 trở lên sẽ có thể trả lại mã sản phẩm cho bạn như là một phần của kết quả tìm kiếm vì nó có hỗ trợ thuộc tính chuỗi.

0.9.10 chưa phải là bản phát hành chính thức nhưng có vẻ tuyệt vời. Có vẻ như Zawodny is running it over at Craig's List vì vậy tôi sẽ không quá lo lắng về việc dựa vào tính năng này.

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