Bạn có thể tạo bảng phụ để giữ tham chiếu về tên thuộc tính. Sau đó, bạn có thể liên kết bảng đó với một bảng hợp nhất — giữa id người dùng và id của một trong các thuộc tính. Làm như vậy, bạn luôn có thể thay đổi các thuộc tính.
Sử dụng khóa ngoài, bạn cũng có thể “ xóa thác ” chi tiết người dùng có thuộc tính không còn tồn tại nữa. Hơn nữa, bạn có thể đảm bảo rằng bạn chỉ thêm các tham chiếu đến các tên thuộc tính hợp lệ và bạn tối ưu hóa tìm kiếm bằng cách sử dụng các chỉ mục.
Hãy nói rằng:
CREATE TABLE user_preferences_headers
(
`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL
);
CREATE TABLE `users`
(
`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`pass` VARCHAR(255) NOT NULL
);
CREATE TABLE `user_preferences`
(
`id_user` INT NOT NULL,
`id_preference_entity` INT NOT NULL,
`value` VARCHAR(255)
);
ALTER TABLE `user_preferences` ADD INDEX (`id_user`);
ALTER TABLE `user_preferences` ADD INDEX (`id_preference_entity`);
ALTER TABLE `user_preferences` ADD FOREIGN KEY (`id_user`) REFERENCES `users` (
`id`
) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `user_preferences` ADD FOREIGN KEY (`id_preference_entity`) REFERENCES `user_preferences_headers` (
`id`
) ON DELETE CASCADE ON UPDATE CASCADE ;
Bây giờ bạn đầu tiên chọn tất cả các tiêu đề từ user_preferences_headers
theo tên, hay không, và bạn sử dụng id để chọn giá trị mong muốn sở thích của người dùng (được xác định cũng bởi id) từ user_preferences
. Lưu ý rằng khi bạn xóa một mục nhập trong user_preferences_headers
, tất cả các mục liên kết đến id của hàng đã xóa cũng sẽ bị xóa.
+1 để chuẩn hóa. Đây là một ý tưởng thực sự tốt IMO. – Herbert