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

Cách xử lý khóa ngoại khi phân vùng

Đọc: Giới hạn phân vùng MySQL

1.) FK không được hỗ trợ trên các bảng được phân vùng.

  • Một tùy chọn là tạo một thủ tục được lưu trữ để chèn / cập nhật bản ghi và để xác minh bên trong thủ tục rằng id người dùng đã chuyển có xuất hiện trong bảng người dùng của bạn trước khi quá trình chèn diễn ra hay không. Bạn nên thiết lập các quyền trên bảng để chỉ SP được phép cập nhật và chèn để cho phép các ứng dụng và / hoặc người dùng kiểm tra ngược lại. Bạn cũng cần phải đề phòng khi xóa người dùng khỏi bảng người dùng.

2.) Cột nào bạn sử dụng để phân vùng sẽ phụ thuộc vào cách bạn truy cập vào bảng. Nếu các truy vấn của bạn luôn dựa trên vechicle no., Thì bạn nên tạo một phân vùng băm trên cột đó. Nếu bạn đang truy vấn hoặc báo cáo thêm về điều gì đó như "những loại xe nào đã được bổ sung trong tháng này" hoặc bạn muốn "triển khai" các phân vùng khi chúng trở thành một độ tuổi nhất định, thì phân vùng theo ngày có thể là cách tốt nhất. Đây là điều bạn sẽ phải quyết định dựa trên mức độ sử dụng của mình.

3.) Xem liên kết ở trên để biết thêm thông tin.

Chỉnh sửa dựa trên câu hỏi của người dùng:

Chèn một bản ghi cứ sau 3 giây không phải là quá nhiều. Đảm bảo rằng bạn có khóa chính trên bảng người dùng của mình để việc kiểm tra bên trong quy trình được thực hiện một cách hiệu quả. (Điều này đúng ngay cả khi FK được hỗ trợ) DB sẽ thực hiện việc kiểm tra hậu trường này cho bạn nếu bạn có hỗ trợ cho FK, theo nghĩa đó, nó không làm tổn thương bạn. Nếu việc kiểm tra kết thúc là một nút cổ chai, bạn có thể cảm thấy cần phải bỏ nó đi và có thể báo cáo id người dùng bị lỗi như một quy trình hàng loạt hàng đêm, nhưng nếu bạn là bảng người dùng tương đối nhỏ và được lập chỉ mục chính xác, tôi không thấy đây là một vấn đề.

Một tùy chọn khác là thực hiện phân vùng theo cách thủ công (tức là sharding) với các bảng được phân vùng hoặc không phân vùng. Tất nhiên, với các bảng không được phân vùng, bạn có thể sử dụng các khóa ngoại gốc. Ví dụ:bạn sẽ chia bảng phương tiện của mình thành nhiều bảng như:(giả sử bạn muốn sử dụng XeNo làm "chìa khóa")

XeNosLessThan1000

XeNosLessThan2000

XeNosLessThan ...

XeNosLessThanMAX

Ở đây bạn có thể muốn có lại SP để ứng dụng / người dùng không cần biết về các bảng. SP sẽ chịu trách nhiệm chèn / cập nhật bảng chính xác dựa trên phương tiện Không được chuyển đến. Bạn cũng sẽ muốn một SP để chọn dữ liệu để ứng dụng / người dùng không cần phải biết bảng để chọn từ đó. Để dễ dàng truy cập vào tất cả dữ liệu, bạn có thể tạo một dạng xem kết hợp tất cả các bảng với nhau.

Lưu ý rằng một lợi ích của việc này là hiện tại MyISAM khóa toàn bộ bảng được phân vùng trong quá trình cập nhật, không chỉ phân vùng mà nó đang cập nhật. Làm sắc nét bảng theo cách này làm giảm bớt sự tranh cãi vì bản thân các bảng là "phân vùng".

Dựa trên dữ liệu hạn chế mà tôi có về những gì bạn đang làm, tôi có thể sẽ viết 2 quy trình được lưu trữ, 1 để chọn dữ liệu và 1 để cập nhật / chèn dữ liệu và yêu cầu ứng dụng của bạn sử dụng chúng để truy cập tất cả. Sau đó, tôi sẽ thử phân vùng thông thường thông qua băm trên xeNo trước trong khi thực thi khóa user_id trong quy trình. Nếu điều này trở thành vấn đề, bạn có thể dễ dàng chuyển sang phân tích dữ liệu trên nhiều bảng trong khi không phải thay đổi ứng dụng vì tất cả logic về cách truy xuất và cập nhật dữ liệu đều có trong SP.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Python Pandas - Sử dụng to_sql để ghi các khung dữ liệu lớn thành nhiều phần

  2. MySQL - Sử dụng If Then Else trong MySQL UPDATE hoặc SELECT Queries

  3. Cách viết truy vấn HQL JOIN cho nhiều Cột đã chọn của bảng bằng cách sử dụng Khối mã lệnh trong Mệnh đề Chọn

  4. Đặt PDO để ném các ngoại lệ theo mặc định

  5. jQuery Xác thực cách sử dụng phương pháp từ xa để kiểm tra xem tên người dùng đã tồn tại chưa