2013-04-20 36 views
8

Tôi có một chuỗi UUID mà tôi muốn sử dụng làm khóa chính của bảng MySQL, UUID là chuỗi ký tự thập lục phân 32 ký tự (sau khi ký tự '-' bị tước). Do thực tế là tốt hơn nên sử dụng một cột số (int) làm khóa chính của bạn trong cơ sở dữ liệu, tôi muốn chuyển đổi thành số nguyên nhưng không chắc chắn cách tốt nhất để xử lý nó.Cách tốt nhất để xử lý lớn (UUID) dưới dạng khóa chính của bảng MySQL

  1. Do kích thước của chuỗi (ví dụ uuid = 'a822ff2bff02461db45ddcd10a2de0c2'), tôi có cần phải chia nhỏ thành nhiều 'dữ liệu' hay không.
  2. Tôi đang chạy PHP trên kiến ​​trúc 32 bit vào lúc này để chuyển đổi nó trong PHP sẽ không hoạt động do kích thước PHP_INT_MAX (tối đa 0xFFFFFFFF). Và tôi nghi ngờ đó sẽ là cùng một hạn chế đối với MySQL.
  3. Tôi không thích ý tưởng của nhiều khóa chính như là một sửa chữa cho điều này, tôi thà sử dụng một biểu diễn chuỗi mặc dù đó không phải là phương pháp ưa thích.

Tôi có thể suy nghĩ về điều này sai, và không chống lại tài liệu đọc, vì vậy các ví dụ hoặc đề xuất đọc như một phản hồi sẽ được chấp nhận.

+0

Cũng cần lưu ý, trường id này sẽ được sử dụng cho cả hai phép nối và lựa chọn. –

Trả lời

25

Đối với hầu hết các trường hợp, tốt nhất là lưu trữ UUID/GUID là BINARY(16). Xem những câu hỏi này StackOverflow liên quan:

Việc chuyển đổi có thể (và có lẽ nên) được thực hiện trong MySQL thay vì PHP như vậy cho dù bạn đang sử dụng một 32bit client PHP hay 64bits không quan trọng một chút (ý định chơi chữ: P)

+0

Điều đó nghe có vẻ chính xác những gì tôi đang tìm kiếm. GUID/UUID không được tạo bởi tôi, nó được lấy từ một nguồn của bên thứ ba. Nó là duy nhất và phục vụ tốt như một khóa chính. @PaulProgrammer Tôi đánh giá cao câu trả lời nhanh chóng của bạn quá, tôi đã +1 bạn cả hai. Cảm ơn bạn đã giúp đỡ trong những câu trả lời này. –

+0

@ Hazzit - bạn có biết nếu nó là hợp pháp để ràng buộc UUID như một chuỗi đến một phương thức bind_param trong MySQLi và chỉ trỏ nó vào một trường nhị phân (16)? Tôi gặp khó khăn trong việc tìm ra liệu tôi có cần thực hiện bất kỳ chuyển đổi nào trước không. – nickdnk

1

Sử dụng loại chuỗi chứ không phải số nguyên. Tốt hơn là chỉ tốt hơn nếu nó giải quyết được một vấn đề.

Nếu bạn thực sự lo lắng về tốc độ tra cứu, hãy sử dụng khóa chính tổng hợp (tăng tự động). Bạn có thể đặt một ràng buộc duy nhất trên cột UUID và chỉ sử dụng nó một lần để tra cứu khóa tổng hợp sau đó được sử dụng cho các kết nối của bạn, v.v.

+0

Tôi đã sử dụng chuỗi trong các dự án trước đây, và tôi tin rằng (trong sản xuất) sẽ chỉ nói vài triệu bản với số lượng cao, vì vậy tôi không nghĩ đây là mối quan tâm hiệu suất lớn (sử dụng dây), tôi không chắc chắn ở kích thước nào, hiệu suất đạt được sẽ đi vào hoạt động bằng cách sử dụng chuỗi so với trường số. Dựa trên kích thước, tôi không hoàn toàn chắc chắn một chìa khóa chính tổng hợp sẽ có lợi trong hàng triệu hồ sơ (nói 10 triệu ngọn) kịch bản. –

+0

Vì vậy, những gì bạn đang nói là không có cách nào thực sự để đóng gói/lưu trữ này trong một đại diện số một cách dễ dàng, các tùy chọn của tôi là chuỗi và chuỗi với các phím tăng tự động tổng hợp. –

+0

Nó không phải là một vấn đề cho đến khi nó là một vấn đề. Cơ sở dữ liệu chất lượng sản xuất (bao gồm mysql) có các thuật toán lập chỉ mục rất thông minh để xử lý các truy vấn chuỗi. Nếu bạn không quan tâm đến hiệu suất, thì tại sao bạn bashing đầu của bạn chống lại bức tường kích thước nguyên lớn nhất trong câu hỏi ban đầu của bạn? – PaulProgrammer

0

Nó cũng phụ thuộc vào bộ lưu trữ. TokuDB nên xử lý tất cả những vấn đề này.

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