Bản năng của bạn để không tạo một bảng lớn với nhiều NULLS là đúng. Đó là một ý tưởng tồi, từ quan điểm lưu trữ / đánh giá lại / bảo trì, cũng như quan điểm xác thực dữ liệu (sẽ nói thêm về điều đó sau).
Hai cách tiếp cận phổ biến nhất:
1) Có một bảng người dùng với tất cả các trường phổ biến trong đó, bao gồm cả trường "userType". Sau đó, có một bảng riêng biệt cho từng loại người dùng chứa các trường bổ sung. Tất cả người dùng có một hàng trong bảng người dùng và một hoặc nhiều bảng loại người dùng cụ thể. Đây là cách chuẩn hóa nhất và hiệu quả nhất để lưu trữ và đăng nhập nhanh chóng. Điều này cũng cho phép bạn sử dụng các khóa ngoại vi và khóa ngoại để đảm bảo rằng tất cả thông tin bắt buộc cho từng loại người dùng đều có sẵn.
2) Có một bảng người dùng với tất cả các trường phổ biến trong đó. Có một bảng khác được gọi là Thuộc tính người dùng có các trường cho userid, key và value. Bất kỳ siêu dữ liệu bổ sung nào cho một người dùng cụ thể đều có thể được lưu trữ tại đây. Điều này có lợi thế là không yêu cầu bất kỳ quản trị cơ sở dữ liệu nào để thêm các kiểu người dùng mới hoặc siêu dữ liệu được lưu trữ cho từng kiểu người dùng. Tuy nhiên, nó không cho phép bạn thực hiện bất kỳ xác thực dữ liệu nào ở cấp DB.