Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL - Tôi có nên sử dụng khóa chính nhiều cột trên mọi bảng con không?

Dữ liệu này được chuẩn hóa

TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data } 
floor { id, building_id, data }
room {id, floor_id, data }
bed {id, room_id, data }

Bảng này không phải là (ý tưởng tồi)

TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data } 
floor { id, building_id, data }
room {id, building_id, floor_id, data }
bed {id, building_id, floor_id, room_id, data }
  1. Trong bảng đầu tiên (tốt), bạn không có dữ liệu trùng lặp không cần thiết.
  2. Chèn trong bảng đầu tiên sẽ nhanh hơn nhiều.
  3. Các bảng đầu tiên sẽ dễ dàng vừa với bộ nhớ hơn, giúp tăng tốc các truy vấn của bạn.
  4. InnoDB được tối ưu hóa với mô hình A, không phải với mô hình B.
  5. Bảng sau (xấu) có dữ liệu trùng lặp, nếu mà không đồng bộ, bạn sẽ có một mớ hỗn độn. DB A không thể khó thoát khỏi đồng bộ hơn nhiều, bởi vì dữ liệu chỉ được liệt kê một lần.
  6. Nếu tôi muốn kết hợp dữ liệu từ tòa nhà, tầng, phòng và giường tôi sẽ cần kết hợp cả bốn bàn trong mô hình A cũng như mô hình B, bạn tiết kiệm thời gian như thế nào ở đây.
  7. InnoDB lưu trữ dữ liệu được lập chỉ mục trong tệp riêng của nó, nếu bạn select chỉ các chỉ mục , bản thân các bảng sẽ không bao giờ được truy cập. Vậy tại sao bạn lại sao chép các chỉ mục? MySQL sẽ không bao giờ cần đọc bảng chính.
  8. InnoDB lưu trữ PK trong mỗi chỉ mục phụ , với tổng hợp và do đó PK dài, bạn đang làm chậm mọi lựa chọn sử dụng chỉ mục và phân chia kích thước tệp; không có lợi gì bao giờ hết.
  9. Bạn có gặp sự cố nghiêm trọng về tốc độ không? Nếu không, bạn đang không chuẩn hóa các bảng của mình?
  10. Thậm chí đừng nghĩ đến việc sử dụng MyISAM để ít gặp phải những vấn đề này hơn, nó không được tối ưu hóa cho cơ sở dữ liệu nhiều kết nối và không hỗ trợ giao dịch hoặc mật độ tham chiếu và không phù hợp với khối lượng công việc này.
  11. Khi sử dụng khóa tổng hợp, bạn chỉ có thể sử dụng phần ngoài cùng bên phải của khóa, tức là bạn không thể sử dụng floor_id trong bàn bed ngoại trừ việc sử dụng id+building_id+floor_id , Điều này có nghĩa là bạn có thể phải sử dụng nhiều không gian phím hơn mức cần thiết trong Mô hình A. Hoặc là hoặc bạn cần thêm một chỉ mục bổ sung (sẽ kéo xung quanh một bản sao đầy đủ của PK).

Tóm lại
Tôi thấy lợi ích hoàn toàn bằng không và có rất nhiều nhược điểm trong Mô hình B, đừng bao giờ sử dụng nó!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. LIMIT bù đắp hoặc OFFSET trong một truy vấn SQL CẬP NHẬT

  2. Khóa mức hàng trong Mysql

  3. tạo 3 danh sách thả xuống phụ thuộc bằng php ajax mysql

  4. CHÈN giá trị từ một bảng vào một bảng khác

  5. làm thế nào để xuất một bảng xếp hạng nhanh chóng từ một bảng mysql của kết quả bóng đá [bóng đá]?