Общий уникальный индекс для нескольких таблиц - возможно ли ?

StUV

Rotaredom
Общий уникальный индекс для нескольких таблиц - возможно ли ?

Возможно ли средствами субд реализовать общий уникальный индекс для нескольких таблиц.

Т.е. чтобы при вставке новой записи в одну из таблиц на стороне бд гарантировалось, что новый авто-инкремент-id будет уникальным в рамках записей более одной таблицы ?
 

StUV

Rotaredom
есть сущности и есть их свойства
на этапе создания свойств и задания их значений определяется какой тип будет иметь данное свойство в бд
есть несколько таблиц для свойств - по одной на тип данных
при создании свойства известно, в какую из таблиц значение вписывается
при выборке выбираем по уникальному ID из всех таблиц свойств - соответственно получим только одно значение соответствующего типа
ясно как контролировать уникальность индекса "своими силами"
интересно - поддерживает ли субд такие решения "на низком уровне"

ЗЫ: возможно у задачи есть более простое решение ?
 

StUV

Rotaredom
хм...
> неправильная архитектура БД
точно нет
скорее возможен неправильный подход к решению задачи

свойство может быть числом, текстом различного объема, бинарником, etc.... - т.е. тип свойства определяется при его создании

каким образом организовать хранение свойств объекта, если набор пар "свойство => тип данных" определяется только в момент создания объекта ?
 

igor-ok

Новичок
А что тебе мешает создать левую (третью) таблицу - хранитель id такого типа:
global_unique_id INT AUTO_INCREMENT,
table_id TINYINT,
local_id INT,
PRIMARY KEY(global_unique_id),
UNIQUE(global_unique_id, table_id, local_id)

И после для того, чтобы узнать глобальный id, придется JOIN-ить таблицу-хранитель id и какую-то другую.
 

StUV

Rotaredom
"глобальный" id известен
неизвестно в какой из таблиц хранятся данные
чтобы механизм работал необходимо при добавлении записи в одну из таблиц быть увереным, что в другой таблице такого нет id, генерируемого инсертом в первой.

---
зы: по поводу альтернативных решений - проще будет хранить свой "автоинкремент" - напр. в файле - и не использовать автоинкременты в "локальных" таблицах - просто генерить руками этот id и подставлять его в инсерт
 

vovik

Новичок
Если силами БД, то можно сделать таблицу из одного поля auto_increment, которая будет генерировать новые значения. А на таблицы со свойствами повесить триггера, которые будут вставлять запись в автоинкремент и подставлять уникальное значение куда надо.

Если хранить в файле - не забудьте про flock() :)
 

StUV

Rotaredom
2vovik
спасибо
данные решения ессно уже принимались во внимание =)
жаль, что нет решения на уровне настроек или "ключевых слов"...
 
Сверху