2015-08-12 16 views
8

Ok, vì vậy tôi chỉ muốn biết những gì hành vi của chú thích này không:Loại chú thích học thuyết = "guid" và chiến lược = "UUID" Hành vi?

/** 
* 
* @ORM\Id 
* @ORM\Column(name="id", type="guid") 
* @ORM\GeneratedValue(strategy="UUID") 
*/ 
protected $id; 

là chìa khóa trong một trật tự incrementing như tôi chèn hàng để bàn của tôi?

Tôi biết rằng các phím là không đơn giản như 00001, 000002 và nó hoạt động như

  • 007f13ff-ce26-11e4-8e3d-a0b3cce9bb7e
  • 00805a63-ce26-11e4-8e3d-a0b3cce9bb7e
  • 0b1b6ca9-d178-11e4-8e3d-a0b3cce9bb7e

nhưng câu hỏi của tôi là, là những các khóa theo thứ tự cụ thể như hàng được chèn đầu tiên là giá trị chữ và số thấp hơn giá trị cuối cùng .. Alw ays?

Trả lời

13

Câu trả lời ngắn: UUID không theo thứ tự cụ thể.

Một số nền

UUID là một thay thế cho autoincrement số nguyên mà đang trở nên ngày càng được sử dụng nhiều hơn bởi vì họ có một số lợi thế.

  1. Bạn sẽ không phá ứng dụng khi bạn chèn bản ghi 65537 (hoặc tương tự 2^x + 1, tùy thuộc vào kích thước ban đầu của ID). Tồi tệ nhất có thể xảy ra là bạn có một định danh trùng lặp, nhưng đó là rất unlikey: https://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates

  2. Bạn có thể tạo ra chúng trong mã của bạn trước lưu trữ các bản ghi; bạn không cần phải lấy "last_insert_id" từ cơ sở dữ liệu. Đó là tốt, ví dụ khi bạn cũng phải lưu trữ một số hồ sơ liên quan trong một bảng khác nhau (tất nhiên Doctrine có thể xử lý điều này cho bạn nhưng đây là một câu chuyện khác).

  3. Bạn không cho đi số lượng các bản ghi trong bảng của bạn để một gã thông minh có thể đọc ID của trật tự hiện nay :-)

Về sắp xếp

Trong hầu hết phiên bản phổ biến hiện đang được sử dụng (v4), UUID hoàn toàn ngẫu nhiên để chúng không theo thứ tự cụ thể.

Phiên bản 1 UUID là sự kết hợp của dấu thời gian 60 bit với địa chỉ MAC 48 bit.

Khi bạn sử dụng chiến lược Doctrine UUID, về cơ bản bạn đang sử dụng triển khai cơ sở dữ liệu cụ thể (ví dụ: UUID() chức năng). Trong trường hợp của MySQL 5.7, đó là một v1 schema tương thích trong đó sản xuất các UUID như

aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee 

nơi

  • aaaaaaaa là phần thấp của timestamp
  • bbbb là phần trung của timestamp
  • cccc là phần cao của dấu thời gian
  • dddd thêm tính độc đáo theo thời gian trong trường hợp được điều chỉnh
  • eeeeeeeeeeee là id nút (địa chỉ MAC)

Kể từ khi timestamp được đảo ngược, nếu bạn sản xuất nhiều UUID trong một khoảng thời gian ngắn bạn sẽ phải họ sắp xếp, nhưng trên về lâu dài họ sẽ không được sắp xếp. Hãy nghĩ đến việc sử dụng giây hiện tại làm phần đầu tiên của UUID.

Lưu ý: câu trả lời được cải thiện nhờ nhận xét @Etki, bổ sung một đóng góp có giá trị và buộc tôi phải tìm hiểu thêm về chủ đề này.

+0

* UUID không theo thứ tự cụ thể * - phụ thuộc vào phiên bản và máy phát – Etki

+0

@Etki cảm ơn bạn đã thêm. Bạn có thể liên kết với một số tài liệu về điều này? –

+1

Tôi không có gì ngoài việc nhàm chán [RFC] (https://www.ietf.org/rfc/rfc4122.txt) trong tầm tay. UUID thường được đề cập xung quanh là UUID phiên bản 4 và hoàn toàn là ngẫu nhiên, do đó không giữ được thứ tự. Tuy nhiên, phiên bản 1 về cơ bản là ghép nối các giá trị thời gian và nút cụ thể, điều này buộc nó tăng lên một cách đơn điệu, vì vậy nếu chỉ có một nút phát ra phiên bản 1 UUID, chúng sẽ được đặt hàng hoàn hảo (và tôi thậm chí nghe nói rằng một số người gắn bó với v1 do đó dữ liệu của họ sẽ được sắp xếp một thứ gì đó tại điểm chèn). – Etki

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