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?
Trả lời
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.)
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:
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
@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) –
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
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ó" :-)
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
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
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
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.
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. –
Đố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.
Đối với cơ sở dữ liệu của first normal form hoặc second normal form.
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ùng và Nhó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ó !
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
Khi đó là khóa CHÍNH, nó vẫn được lập chỉ mục tự động –
- 1. Có lý do nào cho cột Khóa chính không bao giờ được sử dụng không?
- 2. Có tốt không khi có khóa ngoại là khóa chính?
- 3. Lấy "Khóa chính không xác định cho bảng" trong khi ID có ở đó
- 4. RedBean có cần khóa chính "id" không?
- 5. Tôi có cần thêm chỉ mục trên bảng mySQL nếu cột ID là khóa chính không?
- 6. Mọi bảng có khóa chính không?
- 7. Tạo bảng nối không có khóa chính
- 8. Khóa chính kết hợp hay không?
- 9. Thực thể JPA cho một bảng không có khóa chính
- 10. Khi có cột nhận dạng không phải là một ý tưởng hay?
- 11. Bàn không có khóa chính
- 12. Lớp học "sở thích chính" có phải là một ý tưởng hay không?
- 13. Hibernate không có khóa chính
- 14. CSS lớn có phải là một ý tưởng hay không?
- 15. CakePHP Lưu với một bảng mà khóa chính không phải là 'id'
- 16. Ánh xạ bảng Fluent-NHibernate không có khóa chính
- 17. MSMQ có phải là ý tưởng hay không
- 18. Đặt cột làm khóa chính nếu bảng không có khóa chính
- 19. Trong .NET, GCMaxGeneration có bao giờ là không?
- 20. có bao nhiêu múi giờ?
- 21. Bạn có nên tạo loại tùy chỉnh cho khóa chính của mỗi bảng dữ liệu không?
- 22. Thêm cột có khóa chính trong bảng hiện có
- 23. Khóa chính có tự động là chỉ mục không?
- 24. Có bao giờ là lý do chính đáng để lưu trữ thời gian không có trong UTC không?
- 25. Sử dụng DbUnit với các bảng không có khóa chính
- 26. SQLAlchemy một-nhiều mà không có bảng con có khóa chính
- 27. Có thể setTimeout bao giờ trở về 0 làm id không?
- 28. Các cột trong bảng có khóa ngoại là null không?
- 29. foo.foo: Việc đưa ra một cột bảng có cùng tên với chính bảng đó là một ý tưởng tồi không?
- 30. Có bao giờ có lý do chính đáng để sử dụng Sắp xếp Chèn không?
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
đến Mchl nơi tham chiếu đến tài liệu? –