Đối với bất cứ điều gì luôn luôn đặt cho mọi người dùng bạn nên có xu hướng giữ điều đó trong Users
bảng, mỗi lần chuẩn hóa thông thường. Đối với cấu hình tùy chọn, tôi có xu hướng thích cấu trúc bảng sau:
TABLE Users:
id INT AI
name VARCHAR
...
TABLE User_Settings
user_id INT PK,FK
name VARCHAR PK
type BOOL
value_int INT NULL
value_str VARCHAR NULL
Trong đó User_Settings.type
chỉ định xem trường số nguyên hay chuỗi nên được tham chiếu.
tức là:
INSERT INTO Users (id, name) VALUES (1, 'Sammitch');
INSERT INTO User_Settings (user_id, name, type, value_int) VALUES (1, 'level', 1, 75);
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'en');
Và đối với vấn đề CHÈN / CẬP NHẬT:
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'fr')
ON DUPLICATE KEY UPDATE value_str='fr';
Ngoài ra, như hầu hết những người khác đang nói, tuần tự hóa và lưu trữ các tùy chọn không phải là một ý tưởng đặc biệt hay vì:
- Bạn không thể truy xuất một giá trị duy nhất với một truy vấn, bạn phải truy xuất toàn bộ chuỗi được tuần tự hóa, hủy tuần tự hóa nó và loại bỏ dữ liệu không cần thiết.
- Có thể dễ dàng bị hỏng và khó khôi phục.
- Thật là khó khăn khi viết một truy vấn thô, tức là:để sửa toàn cầu một cài đặt nhất định.
- Bạn đang lưu trữ những gì về cơ bản là dữ liệu dạng bảng trong một trường bảng.
Chỉnh sửa hồi cứu tháng 9 năm 2016:
Trong thời gian xen kẽ, tôi đã có một số tranh luận với mọi người về cách tốt nhất để lưu trữ các cài đặt tùy chọn, cũng như cấu trúc bảng chung được xác định ở trên.
Mặc dù cấu trúc bảng đó không hoàn toàn tệ , nó không chính xác là tốt hoặc. Nó đang cố gắng cải thiện tình huống xấu nhất có thể. Việc tuần tự hóa các cài đặt tùy chọn có thể hoạt động miễn là bạn có thể đáp ứng cho các cài đặt này:
- Tất cả được tải cùng một lúc, không cần chọn hay chọn.
- Không thể lập chỉ mục, có thể tìm kiếm hoặc dễ dàng sửa đổi en masse .
Sau đó, bạn có thể cân nhắc thêm một trường như optional_settings
trong Users
bảng chứa biểu mẫu cài đặt [ví dụ:JSON] được tuần tự hóa. Bạn đánh đổi những điều trên, nhưng đó là một cách tiếp cận đơn giản hơn và bạn có thể lưu trữ các cài đặt phức tạp hơn.
Ngoài ra, nếu bạn sử dụng loại LOB như TEXT
để lưu trữ, dữ liệu không nhất thiết phải được lưu trữ "trong hàng" ít nhất là trong MySQL.
Nhưng dù sao, điều đó tùy thuộc vào bạn để xác định các yêu cầu và ràng buộc của ứng dụng của bạn và đưa ra lựa chọn tốt nhất dựa trên thông tin đó.