Я работаю над редактором, который позволяет его пользователям создавать определения «объектов» в режиме реального времени. Определение может содержать ноль или более свойств. Свойство имеет имя тип. После создания определения пользователь может создать объект этого определения и установить значения свойств этого объекта.
Таким образом, одним нажатием кнопки мыши пользователь должен т.е. быть в состоянии создать новое определение под названием «Велосипед» и добавить свойство «Размер» типа «Числовой». Затем другое свойство с именем «Имя» типа «Текст», а затем другое свойство с именем «Цена» типа «Числовой». Как только это будет сделано, пользователь сможет создать пару объектов «Велосипед» и заполнить значения свойств «Имя» и «Цена» каждого велосипеда.
Теперь, я видел эту функцию в нескольких программных продуктах, поэтому это должна быть хорошо известная концепция. Моя проблема началась, когда я сел и попытался придумать схему БД для поддержки этой структуры данных, потому что я хочу, чтобы значения свойств сохранялись с использованием соответствующих типов столбцов. То есть. числовое значение свойства сохраняется как, скажем, 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?