Склонение ФИО (постановка)

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Пример использования)
Строка 4: Строка 4:
  
 
   CREATE TABLE gd_multiname (
 
   CREATE TABLE gd_multiname (
 +
    id      dintkey,
 +
    relname  drelationname,
 
     refid    dintkey,
 
     refid    dintkey,
 
     langid  CHAR(20) NOT NULL,
 
     langid  CHAR(20) NOT NULL,
Строка 9: Строка 11:
 
     name    dname,
 
     name    dname,
 
   
 
   
     PRIMARY KEY gp_pk_multiname (refid, langid, caseid)
+
     PRIMARY KEY gp_pk_multiname (id),
 +
    UNIQUE (refid, langid, caseid)
 
   )
 
   )
  
Эта таблица будет хранить название объекта с идентификатором refid, на языке langid в падеже caseid.
+
Эта таблица будет хранить название объекта с идентификатором refid в таблице relname на языке langid в падеже caseid.
  
 
=== Идентификаторы падежей для русского языка ===
 
=== Идентификаторы падежей для русского языка ===
Строка 94: Строка 97:
  
 
=== Организация пользовательского интерфейса ===
 
=== Организация пользовательского интерфейса ===
 +
 +
В диалоговых окнах тех объектов, которые подразумевают наличие наименований на разных языках (в разных падежах), мы добавляем закладку со списком дополнительных наименований.
  
 
=== Ссылки по теме ===
 
=== Ссылки по теме ===

Версия 19:39, 29 июля 2008

Предлагается решить проблемы склонения имен по падежам и хранения имен на разных языках следующим образом:

Создаем таблицу:

 CREATE TABLE gd_multiname (
   id       dintkey,
   relname  drelationname,
   refid    dintkey,
   langid   CHAR(20) NOT NULL,
   caseid   CHAR(1),
   name     dname,

   PRIMARY KEY gp_pk_multiname (id),
   UNIQUE (refid, langid, caseid)
 )

Эта таблица будет хранить название объекта с идентификатором refid в таблице relname на языке 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 не является внешним ключем, то применить автоматическое каскадное удаление невозможно. Для очистки таблицы от ненужных записей придется написать хранимую процедуру, которая найдет и удалит все записи, которые не ссылаются ни на одну из таблиц в БД.

Организация пользовательского интерфейса

В диалоговых окнах тех объектов, которые подразумевают наличие наименований на разных языках (в разных падежах), мы добавляем закладку со списком дополнительных наименований.

Ссылки по теме

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты