Я работаю над редактором, который позволяет своим пользователям создавать определения "объектов" в режиме реального времени. Определение может содержать ноль или больше свойств. Свойство имеет имя типа. После создания определения пользователь может создать объект этого определения и установить значения свойств этого объекта.
Таким образом, нажатием кнопки мыши пользователь должен, то есть. сможете создать новое определение под названием "Велосипед" и добавить свойство "Размер" типа "Числовой". Затем еще одно свойство под названием "Имя" типа "Текст", а затем другое свойство "Цена" типа "Числовое". Как только это будет сделано, пользователь должен будет создать пару объектов "Велосипед" и заполнить значения свойств "Имя" и "Цена" для каждого байка.
Теперь я видел эту функцию в нескольких программных продуктах, поэтому она должна быть хорошо известной концепцией. Моя проблема началась, когда я сел и попытался придумать схему БД для поддержки этой структуры данных, потому что я хочу, чтобы значения свойств сохранялись с использованием соответствующих типов столбцов. То есть. значение числового свойства сохраняется как, скажем, INT в базе данных, а значение текстового свойства сохраняется как VARCHAR.
Сначала мне нужна таблица, в которой будут храниться все определения моего объекта:
Table obj_defs
id | name |
----------------
1 | "Bicycle" |
2 | "Book" |
Затем мне нужна таблица для хранения свойств каких-либо свойств каждого объекта:
Table prop_defs
id | obj_def_id | name | type |
------------------------------------
1 | 1 | "Size" | ? |
2 | 1 | "Name" | ? |
3 | 1 | "Price" | ? |
4 | 2 | "Title" | ? |
5 | 2 | "Author" | ? |
6 | 2 | "ISBN" | ? |
Мне также нужна таблица, которая содержит каждый объект:
Table objects
id | created | updated |
------------------------------
1 | 2011-05-14 | 2011-06-15 |
2 | 2011-05-14 | 2011-06-15 |
3 | 2011-05-14 | 2011-06-15 |
Наконец, мне нужна таблица, в которой будут храниться фактические значения свойств для каждого объекта, а одно решение для этой таблицы должно иметь один столбец для каждого возможного типа значения, например:
Table prop_vals
id | prop_def_id | object_id | numeric | textual | boolean |
------------------------------------------------------------
1 | 1 | 1 | 27 | | |
2 | 2 | 1 | | "Trek" | |
3 | 3 | 1 | 1249 | | |
4 | 1 | 2 | 26 | | |
5 | 2 | 2 | | "GT" | |
6 | 3 | 2 | 159 | | |
7 | 4 | 3 | | "It" | |
8 | 5 | 3 | | "King" | |
9 | 6 | 4 | 9 | | |
Если бы я реализовал эту схему, что бы зафиксировал столбец "type" таблицы prop_defs? Целые числа, каждая из которых соответствует имени столбца, varchars, которые просто содержат имя столбца? Любые другие возможности? Может ли хранимая процедура каким-то образом помочь мне здесь? И как бы SQL для извлечения свойства "name" объекта 2 выглядел?