Tôi đang tạo một bảng cơ sở dữ liệu và tôi không có khóa chính logic được gán cho nó. Vì vậy, tôi đang suy nghĩ về việc để nó mà không có khóa chính, nhưng tôi cảm thấy có chút tội lỗi về nó. Tôi có nên
Mỗi bảng nên có một khóa chính?
Tôi đang tạo một bảng cơ sở dữ liệu và tôi không có khóa chính logic được gán cho nó. Vì vậy, tôi đang suy nghĩ về việc để nó mà không có khóa chính, nhưng tôi cảm thấy có chút tội lỗi về nó. Tôi có nên
Mỗi bảng nên có một khóa chính?
Câu trả lời:
Câu trả lời ngắn gọn: có .
Câu trả lời dài:
Trong MySQL, công cụ lưu trữ InnoDB luôn tạo khóa chính nếu bạn không chỉ định rõ ràng, do đó tạo thêm một cột mà bạn không có quyền truy cập.
Lưu ý rằng một khóa chính có thể được tổng hợp.
Nếu bạn có bảng liên kết nhiều-nhiều, bạn tạo khóa chính trên tất cả các trường liên quan đến liên kết. Do đó, bạn đảm bảo rằng bạn không có hai hoặc nhiều bản ghi mô tả một liên kết.
Bên cạnh các vấn đề về tính nhất quán logic, hầu hết các công cụ RDBMS sẽ được hưởng lợi từ việc đưa các trường này vào một chỉ mục duy nhất.
Và vì bất kỳ khóa chính nào liên quan đến việc tạo một chỉ mục duy nhất, bạn nên khai báo nó và nhận được cả tính nhất quán và hiệu suất logic.
Xem bài viết này trong blog của tôi để biết lý do tại sao bạn phải luôn tạo một chỉ mục duy nhất trên dữ liệu duy nhất:
PS Có một số trường hợp rất, rất đặc biệt khi bạn không cần khóa chính.
Chủ yếu là chúng bao gồm các bảng nhật ký không có bất kỳ chỉ mục nào vì lý do hiệu suất.
Luôn luôn tốt nhất để có một khóa chính. Bằng cách này, nó đáp ứng dạng bình thường đầu tiên và cho phép bạn tiếp tục theo đường dẫn chuẩn hóa cơ sở dữ liệu .
Như những người khác đã nêu, có một số lý do không có khóa chính, nhưng hầu hết sẽ không bị tổn hại nếu có khóa chính
Gần như bất cứ khi nào tôi tạo một bảng mà không có khóa chính, nghĩ rằng tôi sẽ không cần một bảng, cuối cùng tôi đã quay lại và thêm một bảng. Bây giờ tôi tạo ngay cả các bảng tham gia của mình với trường nhận dạng được tạo tự động mà tôi sử dụng làm khóa chính.
Ngoại trừ một vài trường hợp rất hiếm (có thể là bảng quan hệ nhiều-nhiều hoặc bảng bạn tạm thời sử dụng để tải số lượng lớn dữ liệu), tôi sẽ nói với câu:
Nếu nó không có khóa chính, thì đó không phải là bảng!
Marc
Bạn có bao giờ cần phải tham gia bảng này đến các bảng khác? Bạn có cần một cách để xác định duy nhất một hồ sơ? Nếu câu trả lời là có, bạn cần một khóa chính. Giả sử dữ liệu của bạn giống như bảng khách hàng có tên của những người là khách hàng. Có thể không có khóa tự nhiên vì bạn cần địa chỉ, email, số điện thoại, v.v. để xác định xem Sally Smith này có khác với Sally Smith không và bạn sẽ lưu trữ thông tin đó trong các bảng có liên quan vì người đó có thể có điện thoại, phụ kiện , email, v.v ... Giả sử Sally Smith kết hôn với John Jones và trở thành Sally Jones. Nếu bạn không có bảng onthe khóa nhân tạo, khi bạn cập nhật tên, bạn chỉ cần đổi 7 Sally Smith thành Sally Jones mặc dù chỉ một trong số họ kết hôn và đổi tên.
Bạn nói rằng bạn không có khóa tự nhiên, do đó bạn không có bất kỳ kết hợp trường nào để tạo sự độc đáo, điều này làm cho khóa nhân tạo trở nên quan trọng.
Tôi đã tìm thấy bất cứ khi nào tôi không có khóa tự nhiên, khóa nhân tạo là điều bắt buộc tuyệt đối để duy trì tính toàn vẹn dữ liệu. Nếu bạn có khóa tự nhiên, bạn có thể sử dụng khóa đó làm trường khóa thay thế. Nhưng cá nhân trừ khi khóa tự nhiên là một trường, tôi vẫn thích khóa nhân tạo và chỉ mục duy nhất trên khóa tự nhiên. Bạn sẽ hối tiếc về sau nếu bạn không đặt nó vào.
Đó là một thực hành tốt để có PK trên mỗi bàn, nhưng đó không phải là PHẢI. Rất có thể bạn sẽ cần một chỉ mục duy nhất và / hoặc một chỉ mục được nhóm (có PK hay không) tùy thuộc vào nhu cầu của bạn.
Kiểm tra các phần Khóa chính và Chỉ mục được nhóm trên Sách trực tuyến (đối với SQL Server)
"Các ràng buộc PRIMARY KEY xác định cột hoặc tập hợp các cột có các giá trị xác định duy nhất một hàng trong bảng. Không có hai hàng trong bảng có thể có cùng giá trị khóa chính. Bạn không thể nhập NULL cho bất kỳ cột nào trong khóa chính. khuyên bạn nên sử dụng một cột số nguyên nhỏ làm khóa chính. Mỗi bảng nên có một khóa chính. Một cột hoặc tổ hợp các cột đủ điều kiện làm giá trị khóa chính được gọi là khóa ứng viên. "
Nhưng sau đó cũng kiểm tra điều này: http://www.aisintl.com/case/primary_and_forign_key.html
Không đồng ý với câu trả lời được đề xuất. Câu trả lời ngắn gọn là: KHÔNG .
Mục đích của khóa chính là xác định duy nhất một hàng trên bảng để tạo mối quan hệ với một bảng khác. Theo truyền thống, một giá trị số nguyên tăng tự động được sử dụng cho mục đích này, nhưng có các biến thể cho điều này.
Tuy nhiên, có một số trường hợp, ví dụ ghi dữ liệu chuỗi thời gian, trong đó sự tồn tại của khóa như vậy đơn giản là không cần thiết và chỉ chiếm bộ nhớ. Làm cho một hàng độc đáo chỉ đơn giản là ... không bắt buộc!
Một ví dụ nhỏ: Bảng A: LogData
Columns: DateAndTime, UserId, AttribA, AttribB, AttribC etc...
Không cần khóa chính.
Bảng B: Người dùng
Columns: Id, FirstName, LastName etc.
Khóa chính (Id) cần thiết để được sử dụng làm "khóa ngoại" cho bảng LogData.
Tôi biết rằng để sử dụng một số tính năng nhất định của Gridview trong .NET, bạn cần một khóa chính để Gridview biết được hàng nào cần cập nhật / xóa. Thực hành chung nên có một cụm khóa chính hoặc cụm khóa chính. Cá nhân tôi thích cái trước.
Để làm cho nó bằng chứng trong tương lai bạn thực sự nên. Nếu bạn muốn sao chép nó, bạn sẽ cần một cái. Nếu bạn muốn tham gia nó vào một bảng khác, cuộc sống của bạn (và của những kẻ ngốc đáng thương phải duy trì nó trong năm tới) sẽ dễ dàng hơn rất nhiều.
Tôi đang trong vai trò duy trì ứng dụng được tạo bởi nhóm phát triển ra nước ngoài. Bây giờ tôi có tất cả các loại vấn đề trong ứng dụng vì lược đồ cơ sở dữ liệu ban đầu không chứa các KHÓA CHÍNH trên một số bảng. Vì vậy, xin vui lòng không để người khác đau khổ vì thiết kế kém của bạn. Luôn luôn là ý tưởng tốt để có các khóa chính trên bàn.
Tóm lại, không. Tuy nhiên, bạn cần lưu ý rằng các hoạt động CRUD truy cập của khách hàng nhất định cần có nó. Để chứng minh trong tương lai, tôi có xu hướng luôn sử dụng các khóa chính.
Nếu bạn đang sử dụng Hibernate thì không thể tạo Thực thể mà không có khóa chính. Vấn đề này có thể tạo ra sự cố nếu bạn đang làm việc với cơ sở dữ liệu hiện có được tạo bằng các tập lệnh sql / ddl đơn giản và không có khóa chính nào được thêm vào