Склонение ФИО (постановка)
Предлагается решить проблемы склонения имен по падежам и хранения имен на разных языках следующим образом:
Создаем таблицу:
CREATE TABLE gd_multiname ( refid dintkey, langid CHAR(20) NOT NULL, caseid CHAR(1), name dname, PRIMARY KEY gp_pk_multiname (refid, langid, caseid) )
Эта таблица будет хранить название объекта с идентификатором refid, на языке langid в падеже caseid.
Содержание |
Идентификаторы падежей для русского языка
| Название | Идентификатор |
| Именительный | N |
| Родительный | G |
| Дательный | D |
| Винительный | A |
| Творительный | B |
| Предложный | L |
Пример использования
Пусть в таблице GD_CONTACT мы имеем запись:
ID NAME ========================================== 20000001 Иванов Иван Иванович
а в таблице GD_GOOD:
ID NAME ========================================== 20000002 Мыло
Тогда, в таблице GD_MULTINAME могут быть следующие записи:
REFID LANGID CASEID NAME ============================================================= 20000001 RU D Иванову Ивану Ивановичу 20000001 RU G Иванова Ивана Ивановича 20000001 BE N Іваноў Іван Іванавіч 20000002 EN NULL Soap
Запрос, который извлечет ФИО человека в родительном падеже, будет выглядеть следующим образом:
SELECT
...
COALESCE(m.name, c.name),
...
FROM
...
gd_contact c LEFT JOIN gd_multiname m
ON c.id = m.refid AND m.langid = 'RU' AND m.caseid = 'G'
...
Обратите внимание, что если соответствующая запись в таблице gd_multiname будет отсутствовать, то запрос покажет наименование из таблицы gd_contact.
Аналогично, запрос, который пожет наименование товара на английском, если таковое присутствует в базе:
SELECT
...
COALESCE(m.name, g.name),
...
FROM
...
gd_good g LEFT JOIN gd_multiname m
ON g.id = m.refid AND m.langid = 'EN'
...
Удаление записей из таблицы gd_multiname
Поскольку refid не является внешним ключем, то применить автоматическое каскадное удаление невозможно. Для очистки таблицы от ненужных записей придется написать хранимую процедуру, которая найдет и удалит все записи, которые не ссылаются ни на одну из таблиц в БД.