Nếu bạn đã từng lên kế hoạch tìm kiếm các thuộc tính cụ thể, việc sắp xếp chúng thành một cột duy nhất là một ý tưởng tồi, vì bạn sẽ phải sử dụng các hàm trên mỗi hàng để lấy thông tin ra - điều này hiếm khi quy mô tốt.
Tôi sẽ chọn sự lựa chọn thứ hai của bạn. Có danh sách các thuộc tính trong bảng thuộc tính, các đối tượng trong bảng của riêng chúng và một bảng quan hệ nhiều-nhiều được gọi là thuộc tính đối tượng.
Ví dụ:
Các đối tượngobjects:
object_id integer
object_name varchar(20)
primary key (object_id)
attributes:
attr_id integer
attr_name varchar(20)
primary key (attr_id)
object_attributes:
object_id integer references (objects.object_id)
attr_id integer references (attributes.attr_id)
oa_value varchar(20)
primary key (object_id,attr_id)
Mối quan tâm của bạn về hiệu suất đã được ghi nhận nhưng theo kinh nghiệm của tôi, việc tách một cột luôn tốn kém hơn là kết hợp nhiều cột. Nếu có vấn đề về hiệu suất, bạn hoàn toàn có thể chấp nhận được việc phá vỡ 3NF vì lý do hiệu suất.
Trong trường hợp đó, tôi sẽ lưu trữ nó theo cùng một cách nhưng cũng có một cột với dữ liệu được tuần tự hóa thô. Với điều kiện bạn sử dụng trình kích hoạt chèn / cập nhật để giữ cho cột và dữ liệu kết hợp được đồng bộ hóa, bạn sẽ không gặp bất kỳ sự cố nào. Nhưng bạn không nên lo lắng về điều đó cho đến khi một vấn đề thực sự xuất hiện.
Bằng cách sử dụng các trình kích hoạt đó, bạn giảm thiểu công việc cần thiết để chỉ khi dữ liệu thay đổi. Bằng cách cố gắng trích xuất thông tin cột phụ, bạn thực hiện công việc không cần thiết trên mọi chọn.