2011-12-21 35 views
10

Tôi đang thiết kế một hệ thống mới cho người dùng/khách hàng và tôi có trong tùy chọn người dùng hệ thống của mình. Trước khi tôi bắt đầu tạo mã và cơ sở dữ liệu tôi muốn đảm bảo rằng tôi làm đúng.Lưu dữ liệu dưới dạng mảng hoặc các trường riêng lẻ (php/MySQL)

tôi có những ưu đãi:

  • font size
  • font face
  • font color
  • chủ đề
  • trang chủ
  • tùy chọn bảng điều khiển
  • vài đúng/tùy chọn sai như cho phép chia sẻ, v.v ...

và hơn thế nữa.

Ý tưởng của tôi là tạo từng trường cho từng tùy chọn nhưng tôi có thể thay đổi một đối tượng hoặc mảng thay vì một đốm màu.

Đó có phải là một ý tưởng hay không?

Trả lời

12

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.

+0

+1 để chuẩn hóa. Đây là một ý tưởng thực sự tốt IMO. – Herbert

3

Lưu chúng riêng lẻ sẽ thực hiện tìm kiếm v.v. trên mỗi trường. Nếu bạn serialize chúng, sau đó tìm kiếm sẽ trở nên khó khăn/không thể.
Bạn có thể không cần điều đó ngay bây giờ, nhưng có thể cần phải tiếp tục xuống dòng.

Các vấn đề liên quan