Tại sao lại sử dụng userId trong khi đã có username?

Chào ạ,
Em thấy đối tượng user người ta thường lưu 2 trường là userId (UUID) và username, cả 2 trường đều là unique vậy lại sao lại không dùng username là primary key mà phải tạo thêm field userId làm gì? Trừ trường hợp cho user đổi username sau này.

Em cảm ơn!

1 lý do bạn đã đoán đúng: cho user đổi username sau này. Trường hợp còn lại: username thường dùng ký tự, trong khi đó userId thì dùng con số integer, kiểu gì dùng ký tự cũng tốn nhiều bộ nhớ hơn vì nó hiếm khi ít hơn 4 byte -> chậm hơn.

Do đó, với 2 tỉ người dùng của Facebook, khi dùng interger người ta chỉ tốn có 4 byte, nếu dùng username, có ai đó đặt tên kiểu dài cỡ 20 ký tự (nhiều hệ thống cho phép) quả là cũng mệt mỏi.

4 Likes

để cho db lấy row đó lẹ hơn đó mà. userid thì cũng giống như index trong array, tìm user có userid = 1234 thì db chỉ cần ví dụ truy cập row thứ userid là được. Còn truy cập theo username thì db phải hash username đó ra 1 số nguyên rồi tra trong hash table là index của user theo username xem user đó ở index thứ mấy trong table user. Số nguyên hash đó cũng từa tựa như userid, nhưng ko phải lúc nào hash này cũng unique, thôi thì thêm cột userid để tìm cho lẹ. Cái này áp dụng đối với tất cả các table luôn, unique constraints là 1 cái nhưng lúc nào cũng nên có cột id.

3 Likes

Nhưng mà em thấy người ta random UUID lúc tạo tài khoản anh ạ, bởi Id, đơn hàng, id sản phẩm, id user, … mà để auto increment theo thứ tự thì đối thủ sẽ biết trong database của mình đang có tổng cộng bao nhiêu Item.

1 Like

vậy thì chắc có lẽ cũng là để giấu username của người ta, ví dụ copy 1 cái link có username vd aaa.aa/u/myusername thì dễ bị hack account hơn nếu biết account username chẳng hạn :V còn copy cái link có uuid vd aaa.aa/u/123-abc-345-111 thì ko sao :V

thấy trong này nó bảo nếu để lộ id ra ngoài thì xài uuid, còn ko lộ thì xài auto increment int cho lẹ :V Hoặc kết hợp cả 2, int cho lẹ, uuid để ko lộ nó ra

ko xài int làm pk mà lấy uuid thì lấy uuid làm fk lúc join table khác lại chắc lâu lắm :V

5 Likes

A post was split to a new topic: Tạo random id dạng integer có độ dài khoảng 7-8 chữ số như thế nào?

Không hỏi ké gì hết nha @TranMinhHoang.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?