2011-11-10 13 views
10

Tôi đang làm việc trên trang web cho phép mọi người tạo tiểu sử trực tuyến. Tôi đã tự hỏi nếu nó là sự lựa chọn đúng để sử dụng MySQL ID AUTO_INCREMENT ed như id người dùng của tôi. Cũng nhớ rằng tôi có thể phải sao chép cơ sở dữ liệu trên nhiều máy chủ một ngày?Liệu mysql có tự động tăng an toàn để sử dụng như userID?

ví dụ: bạn sẽ sử dụng phương pháp này cho userIds trên một trang web như Twitter hay Facebook?


Tôi đã thử tạo userIds bằng PHP trước đây. Tôi đã sử dụng một cái gì đó như thế này:

function generateID() { 
     $possible = "1234567890"; 
     $code = ""; 
     $characters = mt_rand(7,14); 
     $i = 0; 
     while ($i < $characters) { 
      $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1); 
      $i++; 
     } 
     return $code; 
} 

Điều này đã cung cấp loại giá trị tôi cần, nhưng tôi luôn phải kiểm tra từ DB nếu ID đó chưa tồn tại.

Không có cách tiếp cận tốt hơn?

Trả lời

14

Tự động tăng mysql có an toàn để sử dụng như userID không?

Nếu hệ thống bảo mật của bạn đáng tin cậy, về cơ bản, có. Nhưng nói chung, các nhà phát triển web cảm thấy không thoải mái khi hiển thị ID cho phép đoán các ID khác chỉ bằng cách tăng hoặc giảm số. Thay vào đó, hãy sử dụng nhiều ID ngẫu nhiên, nhiều chữ số.

Trên ghi chú tối nghĩa hơn, ID số cũng có thể cho phép đối thủ cạnh tranh ước tính mức tăng trưởng của bạn bằng cách theo dõi giá trị gia tăng.

2

Vì bạn đang lên kế hoạch trước và có khả năng phân phối dữ liệu trên cơ sở dữ liệu, bạn nên cân nhắc việc sử dụng hàm UUID() để nhận số nhận dạng duy nhất. Điều này làm cho việc hợp nhất dữ liệu dễ dàng hơn nhiều trong tương lai.

+0

Khóa chính phức hợp là giải pháp tốt hơn nhiều so với UUID() để hợp nhất dữ liệu. –

+0

Có hai trường tư tưởng về vấn đề này - bạn hoặc sử dụng các khóa được tạo nhân tạo để nhận dạng duy nhất một ai đó, hoặc một khóa chính ghép - Joe Celko là người ủng hộ cách tiếp cận thứ hai chẳng hạn. – Andrew

+0

Cảm ơn bạn. Tôi chưa bao giờ sử dụng UUID() trước đây. Theo những gì tôi thấy trên hầu hết các ví dụ trên internet, nó tạo ID dài, ví dụ: 1E8EF774581C102CBCFEF1AB81872213 Tôi có đúng không? Nếu vậy, có cách nào tôi có thể làm ngắn hơn không? Hoặc bất cứ ai có thể giới thiệu tôi đến một trang web giải thích chức năng này tốt hơn (tôi không nghĩ rằng tôi hiểu nó rất tốt)? Cảm ơn – Sthe

0

cá nhân, vâng tôi nghĩ vậy, cho đến một điểm. Khi sao chép một bảng cơ sở dữ liệu với trường tăng tự động, tôi nghĩ rằng trường vẫn giữ giá trị tối đa của nó (tùy thuộc vào cách bạn sao chép nó, kịch bản mà tôi nghĩ là mysqldump với dữ liệu), khi bạn thêm hàng mới , nó sẽ được gán ID tiếp theo. Tuy nhiên, nếu bạn có điều này chạy trên một số cơ sở dữ liệu cùng một lúc, và chúng không được sao chép, bạn sẽ cần một số cách khác để tạo ID để tránh nhận các hàng có cùng ID (mặc dù tôi không thể nghĩ đến một kịch bản mà bạn sẽ làm điều này).

Tôi không thể nói nếu đó là thực hành tốt nhất hay không, nhưng nó chắc chắn hoạt động.

4

Không, nó không phải là một ý tưởng tốt vì id auto_increment không dễ dàng di chuyển. Đối với id người dùng của bạn, bạn muốn id có thể được sao lưu, khôi phục, di chuyển giữa các cá thể cơ sở dữ liệu, v.v. mà không phải lo lắng về sự va chạm của id.

Sẽ tốt hơn nếu bạn tạo chuỗi số duy nhất hoặc số an toàn bằng cách sử dụng một cái gì đó như UUID.

+0

Không có gì ngăn cản bạn tạo khóa kết hợp .. Tôi sẽ không downvote, nhưng bạn đã bỏ qua sử dụng auto_increment quá nhanh. –

0

Có Nếu bạn xóa một hàng nói với id 7, giá trị tiếp theo của tăng tự động sẽ là 8 và không phải 7 lần nữa. Vì vậy, tất cả các giá trị chắc chắn sẽ là duy nhất. và bạn sẽ cần phải cắt bớt bảng để bắt đầu tăng tự động một lần nữa. SO bạn luôn có thể sử dụng trường tăng tự động cho ID người dùng.