2011-01-21 31 views
6

Dường như với tôi như một ý tưởng hay, luôn có một trường hợp nào đó tốt hơn là bạn không có điều này trong bảng?Có bao giờ là ý hay khi không có khóa chính 'id' cho bảng?

+0

Lưu ý rằng khi sử dụng các bảng InnoDB, ngay cả khi bạn không tạo khóa chính một cách rõ ràng, MySQL sẽ tạo chỉ mục nhóm 6 Byte ẩn của riêng nó. – Mchl

+0

đến Mchl nơi tham chiếu đến tài liệu? –

Trả lời

2

Theo kinh nghiệm của tôi, hầu như không bao giờ. (Đối với một "vấn đề tốc độ, tôi chỉ cần chèn và không thực sự quan tâm về việc thu hồi tại thời điểm này" phong cách của ứng dụng, có lẽ.)

Trong khi bạn có thể tưởng tượng không bao giờ sử dụng trường ID, nó gần như luôn luôn khôn ngoan để có một AUTO_INCREMENTing hạnh phúc, bởi vì một ngày bạn có thể cần một. (Tất nhiên, bạn có thể làm một 'ALTER ..' để thêm một, nhưng đó là ngoài điểm.)

6

Thông thường, bạn nên có một số loại PRIMARY KEY.

Có một số tình huống thực sự đặc biệt khi bạn không muốn, đáng chú ý nhất là các bảng nhật ký được sắp xếp heap (không được nhóm) không có bất kỳ chỉ mục nào để tăng tốc độ chèn.

Lưu ý rằng trong MySQL, InnoDB bảng không thể được sắp xếp theo thứ tự do đó điều này chỉ liên quan đến MyISAM bảng.

Cũng lưu ý rằng một PRIMARY KEY có thể được tổng hợp, như trong bảng mối quan hệ many-to-many. Bạn sẽ không có cột id trong bảng như vậy nhưng bạn sẽ có khóa chính kết hợp gồm các cột id của các bảng có liên quan.

Xem câu hỏi này để biết thêm chi tiết:

+0

Tôi đã phải thực hiện một vài truy vấn trong đó có 'id' trong bảng nton thực sự hữu ích. – Matt

+0

@Matt - nếu nó được thực hiện dễ dàng hơn, chẳng hạn như có thể có cùng một sự kiện xuất hiện nhiều lần, bởi vì bạn không thực thi giá trị đó (AID, BID) là duy nhất, có đáng không? Nếu bạn không thực thi các khóa "thực", nhưng chỉ có các cột ID này, bạn có thể dễ dàng kết thúc với các bản sao trong cơ sở dữ liệu của bạn. (Ngược lại, lợi ích duy nhất tôi có thể nghĩ đến việc có cột ID trong trường hợp này là cho phép bạn xác định duy nhất các bản sao khi cố gắng dọn sạch cơ sở dữ liệu) –

+0

Một trường hợp ví dụ khi nó hữu ích, đang gia nhập bảng chính nó trên một khóa ngoài và xác định hàng kết quả nào trùng lặp – Matt

4

Câu trả lời ngắn gọn: có.

Câu trả lời dài hơn: nếu bạn có một bảng được sử dụng trong mối quan hệ nhiều-nhiều, bạn không thực sự cần một khóa chính. Sau đó, nó có thể được coi là một sự lãng phí không gian. Có thể có nhiều ví dụ hơn, đây chỉ là một bằng chứng cho câu trả lời "có" :-)

+1

Bạn cần một hỗn hợp 'PRIMARY KEY' trong bảng mối quan hệ' nhiều-với-nhiều'. – Quassnoi

+0

Không chính xác 'cần', nhưng nó chắc chắn làm cho mọi thứ chạy nhanh hơn. Nó cũng là một khóa chính tự nhiên cho bảng như vậy. – Mchl

+0

Chỉ cần lý thuyết: trong mối quan hệ nhiều-nhiều, tất cả những gì bạn cần là ID cần được liên kết. Bạn không thực sự "cần" một PK. – Dirk

2

Có khóa chính là ý tưởng hay (và cần thiết nếu bạn muốn thiết kế cơ sở dữ liệu được chuẩn hóa hoàn toàn).

Cá nhân, nếu bảng có khóa ứng cử viên tự nhiên, tôi sẽ sử dụng hầu hết thời gian, thay vì thêm cột ID phải được điền giả tạo.

+0

Cung cấp khóa tự nhiên là hợp lý nhỏ gọn, tôi cũng làm điều này. Nếu đó là một 'varchar (1000)', thì tôi có thể sử dụng một đại diện. –

0

Đối với hiệu suất/không gian, tôi tránh trường ID tự động nếu có thể. Nếu bạn có một bảng rất lớn (nhiều triệu hoặc hàng tỷ hồ sơ) thì không gian là quan trọng. nếu bạn có thể tìm thấy khóa chính tốt, có thể sử dụng dựa trên các trường (hoặc các trường khác) thì bạn nên sử dụng khóa đó hơn là giới thiệu một trường ID.

Không có ý nghĩa khi có khóa chính tự động nếu bạn có thể sử dụng một nhóm trường mà bạn có chỉ mục duy nhất làm khóa chính. Bạn chỉ cần cẩn thận với UPDATEs để duy trì tính toàn vẹn tham chiếu.

0

Tùy thuộc vào thiết kế dữ liệu của bạn và cách thức bạn truy cập dữ liệu trong bảng.

Bảng nhật ký thường không cần khóa chính vì bạn thường truy cập nhật ký theo nhóm và không xóa/chỉnh sửa thư đơn (bạn có thể dọn toàn bộ bảng hoặc cửa sổ nhật ký thời gian).

Các thời điểm khác, trường ID có thể không cần thiết. Nếu khách hàng đăng ký với trang web của bạn bằng cách sử dụng OpenID (hoặc chỉ đơn giản là một địa chỉ email) thì bạn đã có khóa chính của mình. Tuy nhiên, trong trường hợp này, bạn nên thêm trường ID dư thừa, vì số nguyên sử dụng ít không gian hơn chuỗi và bạn phải lặp lại ID trong tất cả các mối quan hệ mà thực thể có liên quan!

Cuối cùng, bảng quan hệ không cần ID rõ ràng trong 99% trường hợp. Ví dụ: mối quan hệ nhiều-nhiều giữa Người dùngNhóm. Bảng quan hệ chỉ bao gồm ID người dùng và ID nhóm và rằng là khóa chính của bạn (bạn muốn lập chỉ mục hai trường riêng biệt cho hiệu suất ...).

Nhân tiện, ID tăng tự động không làm chậm hiệu suất đáng kể. Giá trị truy cập được lưu trữ trong siêu dữ liệu của bảng, vì vậy khi DBMS thực hiện chèn, nó sẽ tự động tăng bộ đếm tham chiếu và điều này có thể được thực hiện với số AtomicInteger và số Interlocked tương đương của Java, vì vậy bạn không phải lo lắng về nó !

+0

Cột 'AUTO_INCREMENT' sẽ được lập chỉ mục. Đó là chỉ số làm chậm 'INSERT' vào bảng, không phải là thực tế cho dù cột được tự động tăng lên không. – Quassnoi

+0

Khi đó là khóa CHÍNH, nó vẫn được lập chỉ mục tự động –

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