Концепция БД MIS3 — различия между версиями

Материал из ИбисоПедии
Перейти к: навигация, поиск
(3. Констаринты)
 
(не показано 58 промежуточных версий 5 участников)
Строка 20: Строка 20:
 
| Комментарий к столбцам
 
| Комментарий к столбцам
 
   
 
   
| Все столбцы должны иметь комментарий. Первичный ключ использующий sequence должен содержать комментарий вида «SEQUENCE=[SEQUNECE_NAME]». Такой комментарий позволит вчислить зависимости столбцов от последовательностей.&nbsp;<br>
+
| Все столбцы должны иметь комментарий. <br>
 
|-
 
|-
 
| Комментарии к коду<br>
 
| Комментарии к коду<br>
Строка 27: Строка 27:
 
|}
 
|}
  
TODO Также ye;ys  скрипты для проверки достаточности комментариев на основе MIS2:
+
см pg_script в которой есть скрипты для правильного именования объектов.
* "MIS2\DOC\DB\SCRIPTS\Column - Правит комментарии к ID.sql"  
+
 
* "MIS2\DOC\DB\SCRIPTS\Column - Столбцы без комментария.sql"
+
см скрипты на svn IBIS\trunk\ER3\DB\LocalScripts\
* "MIS2\DOC\DB\SCRIPTS\Columns - Неправильные комментарии к ID.sql"
+
 
* "MIS2\DOC\DB\SCRIPTS\Table - Неправильные комментарии к таблицам.sql"
+
 
 +
TODO Также необходимо добавить скрипты для проверки достаточности комментариев на аналогичные АИДС:
 +
* "DOC\DB\SCRIPTS\Column - Правит комментарии к ID.sql"  
 +
* "DOC\DB\SCRIPTS\Column - Столбцы без комментария.sql"
 +
* "DOC\DB\SCRIPTS\Columns - Неправильные комментарии к ID.sql"
 +
* "DOC\DB\SCRIPTS\Table - Неправильные комментарии к таблицам.sql"
  
 
== Соглашение об именовании  ==
 
== Соглашение об именовании  ==
  
Таблицы, процедуры, пакеты именуются без префиксов в единственном числе на английском языке. Для вторичных объектов - последовательностей, ключей, индексов и так далее - должны быть определены четкие правила, выводящие их имя из имени основного объекта. Какие именно - не суть; главное, нужен однозначный алгоритм. Большим минусом здесь является ограничение длины идентификаторов.
+
Таблицы, процедуры, пакеты именуются без префиксов в единственном числе на английском языке. Для вторичных объектов - последовательностей, ключей, индексов и так далее - правила, выводящие их имя из имени основного объекта.  
 
   
 
   
  
Строка 45: Строка 50:
 
1.2. Все таблицы и столбцы должны иметь комментарий. Для таблицы в комментарии обязательно должно быть написано кто автор таблицы. (После строчки “Author:” ). Если автор у таблицы изменился, то старого автора оставлять.
 
1.2. Все таблицы и столбцы должны иметь комментарий. Для таблицы в комментарии обязательно должно быть написано кто автор таблицы. (После строчки “Author:” ). Если автор у таблицы изменился, то старого автора оставлять.
  
1.3. Каждая таблица должна иметь первичный ключ, типа serial или bigserial (для таблиц в которых предполагается больше 1 млн записей).
+
1.3. Каждая таблица должна иметь первичный ключ, типа serial (smallserial) или bigserial (для таблиц в которых предполагается больше 1 млн записей).
  
1.4. Первичные ключи делаем через serial или bigserial
+
1.4. Первичные ключи делаем через serial (smallserial) или bigserial
  
 
1.5. Столбцы, ссылающиеся на другую таблицы именовать по правилу: '''%TABLE%_ID'''
 
1.5. Столбцы, ссылающиеся на другую таблицы именовать по правилу: '''%TABLE%_ID'''
Строка 58: Строка 63:
  
 
1.9. Таблицы копии %TABLE%_YYMMDD
 
1.9. Таблицы копии %TABLE%_YYMMDD
 +
 +
1.10. Не рекомендуется в названиях столбцов использовать отрицательную частицу (not и.т)
  
 
=== 2. Индексы ===
 
=== 2. Индексы ===
Внимание в таблице pg_script существует скрипт, который правильно переименовывает все индексы
+
{{warning}} на SVN существует скрипт, который правильно переименовывает все индексы (trunk/ER3/DB/LocalScripts/Index_name.sql)
  
 
2.1. Индексы не уникальные (NORMAL) именуются по правилу '''IX_%TABLE%$%FIELDS%'''.  
 
2.1. Индексы не уникальные (NORMAL) именуются по правилу '''IX_%TABLE%$%FIELDS%'''.  
Строка 72: Строка 79:
 
=== 3. Констаринты ===
 
=== 3. Констаринты ===
  
3.1. Ссылки (References) именуем по правилу '''FK_%TABLE%$% REFTABLEF%$%FIELDS%.'''  
+
3.1. Ссылки (References) именуем по правилу '''FK_%TABLE%$%REFTABLEF%$%FIELDS%.'''  
 
 
3.2. Not Null. Необязательное правило '''NN_%TABLE%$%FIELD%'''. Есть скрипт который все переименовывает.
 
  
3.3. Первичный ключ именуются по правилу '''PK_%TABLE%$%FIELD%'''
+
3.2. Первичный ключ именуются по правилу '''PK_%TABLE%$%FIELD%'''
  
 
=== 4. Триггеры ===
 
=== 4. Триггеры ===
  
4.1. Именуются по правилу '''%TABLE%$%Суффикс%'''. Где суффикс определяет тип триггера и может иметь длину от 2 до 5 символов.  
+
4.1. Триггеры именуются по правилу '''%TABLE%_tr_%Суффикс%'''. Где суффикс определяет тип триггера и может иметь длину от 2 до 5 символов.  
 
* Первая буква определяет момент срабатывания триггера (Timing) и может имеет значение A или B (After, Before)
 
* Первая буква определяет момент срабатывания триггера (Timing) и может имеет значение A или B (After, Before)
 
* ДалееObject Event  - комбинация букв I,U,D
 
* ДалееObject Event  - комбинация букв I,U,D
 
* Если триггер уровня оператора, то прибавляем в конце S
 
* Если триггер уровня оператора, то прибавляем в конце S
  
 +
4.2. Триггерные функции именуются по правилу ''%TABLE%_tr_%имя из триггера%'''_fn
 +
 +
для проверки именования триггеров существует функция mm.dev_ddl_check_trigger()
 +
 +
для проверки именования триггерных функций существует функция mm.dev_ddl_check_trigger_func()
  
 
=== 5. Другие объекты ===
 
=== 5. Другие объекты ===
  
5.1. SEQUENCE должны иметь суффикс SEQ. Правило  выглядит так %TABLE%_%COLUMN%_SEQ.
+
5.1. SEQUENCE Правило  выглядит так %TABLE%_%COLUMN%_SEQ.
  
 
5.2. Views            : <name>_V
 
5.2. Views            : <name>_V
Строка 100: Строка 110:
 
5.6. External Tables  : <name>_EXT
 
5.6. External Tables  : <name>_EXT
  
=== 6. PL/SQL Variables ===
+
=== 6. PqSQL Variables ===
 
 
6.1. Package Global Variables: g_variable_name
 
 
 
6.2. Local Variables        : l_variable_name
 
 
 
6.3. Types                  : t_type_name
 
 
 
6.4. Cursors                : c_cursor_name
 
 
 
6.5. Exceptions              : e_exception_name
 
 
 
6.6. Input Parameters        : i_parameter_name
 
 
 
6.7. Outut Parameters        : o_parameter_name
 
 
 
6.8. In/Out Parameters      : io_parameter_name
 
 
 
 
 
=== 7. Процедуры, функции, пакеты  ===
 
 
 
7.1. При объявлении переменных в заголовке обязателен префикс p_. Это избавит от неоднозначности при компиляции
 
 
 
 
7.2. Переменные внутри PL/SQL блока должны иметь префикс v_. Это избавит от неоднозначности при компиляции
 
 
  
7.3. Процедуры изменяющие данные в таблицах, должны иметь префикс '''DO_'''
+
6.1. Package Global Variables: g_variable_name <br>
+
6.2. Local Variables        : v_variable_name <br>
 +
6.3. Types                  : t_type_name <br>
 +
6.4. Cursors                : c_cursor_name <br>
 +
6.5. Exceptions              : e_exception_name <br>
 +
6.6. Input Parameters        : i_parameter_name <br>
 +
6.7. Outut Parameters        : o_parameter_name<br>
 +
6.8. In/Out Parameters      : io_parameter_name <br>
  
7.4. Функции, возвращающие значение должные иметь префикс '''GET_'''
+
=== 7. Процедуры, функции ===
 
 
 
7.5. Комментарии пишем в виде, plsqldoc (plugin for plsqlDeveloper). Основные Тэги:
 
 
 
 
{| width="100%" border="1" cellpadding="0" cellspacing="0"
 
|-
 
! scope="col" | Tag
 
! scope="col" | Description
 
|-
 
| %param &lt;name&gt; &lt;text&gt;<br>
 
| The description of a function or procedure parameter. Subsequent %param tags will be placed in one table.<br>
 
|-
 
| %return &lt;text&gt;<br>
 
| A description of the return value of a function.<br>
 
|-
 
| %value &lt;name&gt; &lt;text&gt;<br>
 
| A possible value for a package variable or object type attribute. Subsequent %value tags will be placed in one table.<br>
 
|-
 
| %raises &lt;name[.element]&gt; &lt;text&gt;<br>
 
| A list of exceptions that can be raised by a program unit. Subsequent %raises tags will be placed in one table.<br>
 
|-
 
| %usage &lt;text&gt;<br>
 
| A text to describe the usage of the element.<br>
 
|-
 
| %author &lt;name&gt;<br>
 
| The author of the object<br>
 
|-
 
| {%link &lt;name[.element[;n]]&gt; <br> [description]}<br>or<br>{%link &lt;filename&gt; [description]}<br><br>
 
| An explicit hyperlink. To link to a specific overloading of a program unit, follow the name by a semi-colon and the overload index (1-based). The optional description will be placed in the document. For example:<br>The {%link department.name department name function} is...<br>Will result in:<br>The department name function is…<br><br>
 
|-
 
| {*} &lt;name&gt; &lt;text&gt;<br>
 
| A bullet of a bullet list. Useful to describe possible values of a parameter or return value. For example:<br>{*} 0 The function returned successfully<br>{*} 1 The employee does not exist<br>{*} 2 The employee record is locked<br><br>
 
|-
 
| {%skip}<br>
 
| Skip this comment block for documentation.<br>
 
|-
 
|}
 
 
 
<br>
 
Пример:
 
<source lang="sql">
 
create or replace package Department is
 
 
 
  -- Package with functionality related to the Dept table.
 
  -- Most functions require a p_DeptNo parameter, which
 
  -- is the value of the DeptNo column in the {%link Dept}
 
  -- table.
 
 
 
  -- Value for p_Wait parameters, indicating to wait
 
  -- until a lock is released.
 
  c_Wait constant boolean := true;
 
  -- Value for p_Wait parameters, indicating not to
 
  -- wait until a lock is released.
 
  c_NoWait constant boolean := false;
 
 
 
  -- Exception raised when an invalid order is specified
 
  e_InvalidOrder exception;
 
  -- Exception raised when a record is locked
 
  e_RecordLocked exception;
 
 
 
  -- A department record. It contains all columns of the
 
  -- {%link Dept} table.
 
  subtype t_DeptRecord is Dept%rowtype;
 
 
 
  -- A cursor type for parameters that return a set of
 
  -- departments.
 
  type t_DeptCursor is ref cursor return Dept%rowtype;
 
 
 
  -- Open a cursor to select departments in a particular order.
 
  -- %param p_cursor The cursor that will be opened for all
 
  --                Dept records in the given order
 
  -- %param p_order  The order of the Dept records. Valid values are:
 
  --                {*} 'DEPTNO' Records are ordered by DeptNo.
 
  --                {*} 'NAME'  Records are ordered by name.
 
  --                {*} 'LOC'    Records are ordered by loc. The secondary
 
  --                              sort column is DeptNo.
 
  --                {*} NULL    The result set  will not be ordered
 
  --                              (default).
 
  -- %raises e_InvalidOrder Raised when the value of p_order is invalid.
 
  procedure SelectRecords(p_Cursor in out t_DeptCursor,
 
                          p_Order  varchar2 default null);
 
 
 
  -- Lock a Dept record.
 
  -- %param p_DeptNo The number of the department record to lock.
 
  -- %param p_Wait  Wait for an existing lock to be released?
 
  --                {*} c_Wait  Wait until the record is available.
 
  --                {*} c_NoWait Don't wait, and raise e_RecordLocked
 
  --                              if the record is locked.
 
  -- %raises e_RecordLocked Raised when the record is locked and
 
  --                        p_Wait = c_Wait.
 
  procedure LockRecord(p_DeptNo Dept.DeptNo%type,
 
                      p_Wait  boolean default c_Wait);
 
 
 
  -- Return the number of employees in the {%link Emp} table that
 
  -- belong to this department.
 
  -- %param  p_DeptNo The number of the department.
 
  -- %return The number of employees
 
  function EmpCount(p_DeptNo Dept.DeptNo%type) return integer;
 
 
 
  -- Return the employee number of the manager of the department.
 
  -- %param  p_DeptNo The number of the department.
 
  -- %return The number of the employee (Emp.EmpNo) that manages
 
  --        this department (Emp.job = 'MANAGER'). If the
 
  --        department does not have a manager, NULL is returned.
 
  function Manager(p_DeptNo Dept.DeptNo%type) return Emp.EmpNo%type;
 
 
 
end Department;
 
 
 
</source>
 
  
 +
7.0. Имя функции должно начинаться с имени сущности. Например addr_clone <br>
 +
7.1. При объявлении переменных в заголовке обязателен префикс p_. Это избавит от неоднозначности при компиляции <br>
 +
7.2. Переменные внутри PL/SQL блока должны иметь префикс v_. Это избавит от неоднозначности при компиляции<br>
 +
7.3. Процедуры изменяющие данные в таблицах, должны содержать '''DO''' <br>
 +
7.4. Функции, возвращающие значение должные должны содержать '''GET''' <br>
  
 
=== 8. Объекты связанные с аудитом данных ===
 
=== 8. Объекты связанные с аудитом данных ===
* Весь аудит храниться в схеме audit.Для преобразования данных из hstore в русские названия используются %table_name_hstore_transform%
+
* Весь аудит храниться в схеме audit.Для преобразования данных из hstore в русские названия используются %table_name_hstore_transform%. См статью [[Аудит в MIS3]]
  
 
=== 9. Сводная таблица правил ===
 
=== 9. Сводная таблица правил ===
Строка 427: Строка 313:
 
| отчет
 
| отчет
 
|-
 
|-
| Required
+
| Request
 
| REQ
 
| REQ
|  
+
| Запрос
 
|-
 
|-
 
| Section
 
| Section
Строка 460: Строка 346:
 
|}
 
|}
  
См также скрипты для проверки правильности именования объектов:
+
см  pg_script в которой есть скрипты для правильного именования объектов.
* "MIS2\DOC\DB\SCRIPTS\Constraint - Set RULE FK name.sql"
 
* "MIS2\DOC\DB\SCRIPTS\Index - Set RULE Name.sql"
 
* "MIS2\DOC\DB\SCRIPTSIndex - Процент правильно именованных индексов.sql"
 
* "MIS2\DOC\DB\SCRIPTS\SEQUENCE - Неправильно названные.sql"
 
* "MIS2\DOC\DB\SCRIPTS\Table -названия во множественном числе.sql"
 
* "MIS2\DOC\DB\SCRIPTS\Trigger - Создаем скрипт для правильного именования.sql"
 
  
 
== Безопасность ==
 
== Безопасность ==
  
Авторизация пользователей осуществляется с помощью стандартных средств Oracle. При этом:
+
Авторизация пользователей осуществляется с помощью стандартных средств Postgresql. При этом:
 
* скрывается истинный пароль и пользователя.  
 
* скрывается истинный пароль и пользователя.  
* Пользователь MIS имеет очень сложный пароль и под ним никто не должен логиниться.
+
* Пользователь SOFTMASTER имеет очень сложный пароль и под ним никто не должен логиниться.
 
* Логины (ВСЕГДА БОЛЬШИМИ БУКВАМИ!) postgresql формируются по правилу X+<логин большими буквами в системе МИС>
 
* Логины (ВСЕГДА БОЛЬШИМИ БУКВАМИ!) postgresql формируются по правилу X+<логин большими буквами в системе МИС>
* Пользователь SOFTMASTER (БОЛЬШИМИ БУКВАМИ) обладает всеми правами.
+
* Пользователь SOFTMASTER (БОЛЬШИМИ БУКВАМИ) обладает всеми правами (из под него ставиться БД)
  
  
Строка 483: Строка 363:
 
! scope="col" | Назначение и права
 
! scope="col" | Назначение и права
 
|-
 
|-
| MIS_ROLE
+
| MIS_USER
| Роль которой обладают все пользователи МИС. Дает необходимые права для работы в системе
+
| Роль которой обладают все пользователи МИС. Дает необходимые права для работы в системе. Является владельцем всех объектов
 
|-
 
|-
| DEVELOPER_ROLE
+
|  
| Роль для девелоперов
+
|  
 
|}
 
|}
  
Строка 504: Строка 384:
 
| Аудит данных. История изменения
 
| Аудит данных. История изменения
 
|-
 
|-
| ht
+
| zz
 
| Архивные данные
 
| Архивные данные
 
|-
 
|-
 
| rls
 
| rls
| база данных rls
+
| база данных РЛС - реестр лекарственных средств России (РЛС). Только для чтения. Есть импорт данных
 +
|-
 +
| nsi
 +
| нормативно справочная инфомрация
 +
|-
 +
| dd
 +
| временная схема, в которой обычно храним таблциы с данными из унаследованных систем
 +
|-
 +
| oms
 +
| данные по выгурзке в ФОМС
 +
|-
 +
| nsi
 +
| Нормативно справочная информация. Есть возможность загружать из nsi.rosminzdrav.ru
 +
|-
 +
| ismlp
 +
| Схема для объектов ИСЛМП
 +
|-
 +
| iemk
 +
| Объекты для работы с ИЭМК ХМАО
 +
|-
 +
| isar
 +
| Выгрузка диспансеризации ХМАО
 +
 
 +
 
 
|}
 
|}
  
Строка 542: Строка 445:
  
 
Описание механизма аудита смотреть в комментариях к функциям audit.audit_table
 
Описание механизма аудита смотреть в комментариях к функциям audit.audit_table
 +
см отдельную статью [[Аудит в MIS3]]
  
 
== Резервное копирование ==
 
== Резервное копирование ==
 +
 +
* pg_basebackup + wal archive на неделю (для возможности отката базы на любое время в течении недели назад)
 +
* pg_dump раз в неделю с аккуратно настроенными политиками хранения архивов (на случай если попросят восстановить базу чтобы что то посмотреть например на начало 2010 года).
 +
* hot standby на случай сбоя мастер сервера
 +
 +
Ссылки
  
 
* http://habrahabr.ru/post/197742/
 
* http://habrahabr.ru/post/197742/
Строка 549: Строка 459:
 
== Разделение данных на оперативные данные и архивные. ==
 
== Разделение данных на оперативные данные и архивные. ==
  
Таблицы, которые относятся к архивным данным хранить в схеме ht, таблспейсы HST_DATA, HST_INDX
+
Таблицы, которые относятся к архивным данным хранить в схеме zz, таблспейсы HST_DATA, HST_INDX
  
 
== Верификация ==
 
== Верификация ==
  
Скрипты для верификации именования и расположения объектов находятся в таблице mm.pg_script. На данный момент это:
+
Последняя версия скриптов для верификации именования и расположения объектов находятся на SVN IBIS/trunk/ER3/DB/LocalScripts На данный момент это:
* установка правильного owner у всех таблиц (должен быть SOFTMASTER)
+
* правильные имена constraint (Constraint_name.sql) - делает сразу правильные
* правильные имена constraint
+
* правильные имена index (Index_name.sql) (делает сразу правильные)
* правильные имена index
+
* функции у которых нет комментария Check_comments\funct_desc_check.sql
 +
* таблицы у которых нет комментариев Check_comments\table_desc_check.sql
 +
* для всех объектов овнер должен быть MIS_USER (select mm.mis_user_owner)
  
 
== Ссылки ==
 
== Ссылки ==
 +
* http://www.sqlstyle.guide
  
 
+
[[Категория:Руководство программиста MIS3]]
[[Категория:Postgresql]] [[Категория:MIS3]]
+
[[Категория:Postgresql]]

Текущая версия на 11:32, 21 апреля 2022

Целостность

База сама должна поддерживать целостность данных – это возможно с помощью стандартных средств constraint и trigger.

Foreign Key на другие схемы допускается только в состоянии Disable. (подумать почему, и может быть сделать более жесткое требование).

TODO Нужен скрипт который помогает найти недостающие FK. смотри на SVN "ER\DOC\DB\SCRIPTS\Columns - Кандидаты на FK.SQL"

Самодокументирование

Количество комментариев, Foregn Key должно и правил именования должно быть достаточным для понимания БД. Поэтому предъявляются следующие требования

Таблица Все таблицы и столбцы должны иметь комментарий. Для таблицы в комментарии обязательно должно быть написано кто автор таблицы Строка Author
Комментарий к столбцам Все столбцы должны иметь комментарий.
Комментарии к коду
За основу берем формат комментариев из PLSQLDeveloper. Инструкция находится рядом с этим документом

см pg_script в которой есть скрипты для правильного именования объектов.

см скрипты на svn IBIS\trunk\ER3\DB\LocalScripts\


TODO Также необходимо добавить скрипты для проверки достаточности комментариев на аналогичные АИДС:

  • "DOC\DB\SCRIPTS\Column - Правит комментарии к ID.sql"
  • "DOC\DB\SCRIPTS\Column - Столбцы без комментария.sql"
  • "DOC\DB\SCRIPTS\Columns - Неправильные комментарии к ID.sql"
  • "DOC\DB\SCRIPTS\Table - Неправильные комментарии к таблицам.sql"

Соглашение об именовании

Таблицы, процедуры, пакеты именуются без префиксов в единственном числе на английском языке. Для вторичных объектов - последовательностей, ключей, индексов и так далее - правила, выводящие их имя из имени основного объекта.


1. Таблицы

1.1. Таблицы именуются существительными в ед. числе на английском языке маленькими буквами. (Рассматривать как название сущности). Не использовать в именовании этих объектов символ «$»

1.2. Все таблицы и столбцы должны иметь комментарий. Для таблицы в комментарии обязательно должно быть написано кто автор таблицы. (После строчки “Author:” ). Если автор у таблицы изменился, то старого автора оставлять.

1.3. Каждая таблица должна иметь первичный ключ, типа serial (smallserial) или bigserial (для таблиц в которых предполагается больше 1 млн записей).

1.4. Первичные ключи делаем через serial (smallserial) или bigserial

1.5. Столбцы, ссылающиеся на другую таблицы именовать по правилу: %TABLE%_ID

1.6. Таблицы содержащие исторические данные %TABLE%_H

1.7. Временные таблицы %TABLE%_TMP

1.8. Таблицы созданные для каких либо тестов TEST_%TABLE%

1.9. Таблицы копии %TABLE%_YYMMDD

1.10. Не рекомендуется в названиях столбцов использовать отрицательную частицу (not и.т)

2. Индексы

Warning Внимание: на SVN существует скрипт, который правильно переименовывает все индексы (trunk/ER3/DB/LocalScripts/Index_name.sql)

2.1. Индексы не уникальные (NORMAL) именуются по правилу IX_%TABLE%$%FIELDS%.

2.2. Индексы уникальные именовать по правилу IU_%TABLE%$%FIELDS%.

2.3. Индексы функциональные (FUNCTION-BASED NORMAL) именовать по правилу IF_%TABLE%$%FUNC%.

2.4. Индексы первичного ключа именуются так же как и сам первичный ключ PK_%TABLE%$FIELD%

3. Констаринты

3.1. Ссылки (References) именуем по правилу FK_%TABLE%$%REFTABLEF%$%FIELDS%.

3.2. Первичный ключ именуются по правилу PK_%TABLE%$%FIELD%

4. Триггеры

4.1. Триггеры именуются по правилу %TABLE%_tr_%Суффикс%. Где суффикс определяет тип триггера и может иметь длину от 2 до 5 символов.

  • Первая буква определяет момент срабатывания триггера (Timing) и может имеет значение A или B (After, Before)
  • ДалееObject Event - комбинация букв I,U,D
  • Если триггер уровня оператора, то прибавляем в конце S

4.2. Триггерные функции именуются по правилу %TABLE%_tr_%имя из триггера%'_fn

для проверки именования триггеров существует функция mm.dev_ddl_check_trigger()
для проверки именования триггерных функций существует функция mm.dev_ddl_check_trigger_func()

5. Другие объекты

5.1. SEQUENCE Правило выглядит так %TABLE%_%COLUMN%_SEQ.

5.2. Views  : <name>_V

5.3. Materialized Views: <name>_MV

5.4. Types  : <name>_T

5.5. Directories  : <name>_DIR

5.6. External Tables  : <name>_EXT

6. PqSQL Variables

6.1. Package Global Variables: g_variable_name
6.2. Local Variables  : v_variable_name
6.3. Types  : t_type_name
6.4. Cursors  : c_cursor_name
6.5. Exceptions  : e_exception_name
6.6. Input Parameters  : i_parameter_name
6.7. Outut Parameters  : o_parameter_name
6.8. In/Out Parameters  : io_parameter_name

7. Процедуры, функции

7.0. Имя функции должно начинаться с имени сущности. Например addr_clone
7.1. При объявлении переменных в заголовке обязателен префикс p_. Это избавит от неоднозначности при компиляции
7.2. Переменные внутри PL/SQL блока должны иметь префикс v_. Это избавит от неоднозначности при компиляции
7.3. Процедуры изменяющие данные в таблицах, должны содержать DO
7.4. Функции, возвращающие значение должные должны содержать GET

8. Объекты связанные с аудитом данных

  • Весь аудит храниться в схеме audit.Для преобразования данных из hstore в русские названия используются %table_name_hstore_transform%. См статью Аудит в MIS3

9. Сводная таблица правил

10. Сокращения

Если при именовании подчиненных объектов (FK и прочее), выходим за ограничение длины, то использовать следующее правило:

  • APPLICATIONS = APPL (4)
  • APPLICATION_FUNCTIONS = APFU (2:2)
  • APPLICATON_FUNCTION_ROLES = APFR (2:1:1)
  • APPLICATION_FUNCTION_ROLE_BANANAS = AFRB (1:1:1:1)

По возможности использовать стандартные сокращения при названии сущностей  :

Стандартные сокращения
Account ACCNT
Addres ADDR Адрес
Adjustment ADJ
Alternate ALT
Application APP
Attribute ATTR
Beginning BEG
Budget BUDG
Category CATG
COUNT CNT
Difference DIFF
Column COL
Comment CMT Комментарий
Currency CURR
Customer CUST заказчик
DATE DT дата
DAY DY день
Department DEPT отдел, подразделение
Document DOC документ
Employee EMP работник
Error ERR
Identifier ID
Information INFO информация
Inventory INV Опись. Реестр, инвентарь
Location LOC местоположение
Length LNTH длина
Month MO месяц
Number NUM номер, количество
Organization ORG организация
Option OPT
Payment PAY платеж
Percent PCT процент
Previous PREV предыдущий
Record REC запись
Report RPT отчет
Request REQ Запрос
Section SECT секция
Status STS статус
Table TAB таблица
Temporary TEMP временный
Value VAL значение, переменная
Version VER версия
Year YR год

см pg_script в которой есть скрипты для правильного именования объектов.

Безопасность

Авторизация пользователей осуществляется с помощью стандартных средств Postgresql. При этом:

  • скрывается истинный пароль и пользователя.
  • Пользователь SOFTMASTER имеет очень сложный пароль и под ним никто не должен логиниться.
  • Логины (ВСЕГДА БОЛЬШИМИ БУКВАМИ!) postgresql формируются по правилу X+<логин большими буквами в системе МИС>
  • Пользователь SOFTMASTER (БОЛЬШИМИ БУКВАМИ) обладает всеми правами (из под него ставиться БД)


Роли POSTGRESQL

Роль Назначение и права
MIS_USER Роль которой обладают все пользователи МИС. Дает необходимые права для работы в системе. Является владельцем всех объектов

Разделение схем

Название схем должны быть в нижнем регистре. Все данные МИС должны храниться в схеме mm. Данные аудита должны храниться в схеме audit. Архивные данные в схеме ht.

Схема Назначение
mm Основная схема для хранения данных
audit Аудит данных. История изменения
zz Архивные данные
rls база данных РЛС - реестр лекарственных средств России (РЛС). Только для чтения. Есть импорт данных
nsi нормативно справочная инфомрация
dd временная схема, в которой обычно храним таблциы с данными из унаследованных систем
oms данные по выгурзке в ФОМС
nsi Нормативно справочная информация. Есть возможность загружать из nsi.rosminzdrav.ru
ismlp Схема для объектов ИСЛМП
iemk Объекты для работы с ИЭМК ХМАО
isar Выгрузка диспансеризации ХМАО


Табличные пространства

Данные и индексы хранить в разных таблспейсах USR_DATA и USR _INDX . Данные аудита хранить в таблеспейсах LOG_DATA и LOG_INDX. Архивные данные в схемах HST_DATA и HST_INDX.

Tablespace Назначение
USR_DATA таблицы данных из схемы MIS
USR_INDX индексы из схемы MIS
LOG_DATA Данные аудита
LOG_INDX Архивные данные
HST_DATA Индексы архива
HST_INDX Индексы аудита

AUDIT

Описание механизма аудита смотреть в комментариях к функциям audit.audit_table см отдельную статью Аудит в MIS3

Резервное копирование

  • pg_basebackup + wal archive на неделю (для возможности отката базы на любое время в течении недели назад)
  • pg_dump раз в неделю с аккуратно настроенными политиками хранения архивов (на случай если попросят восстановить базу чтобы что то посмотреть например на начало 2010 года).
  • hot standby на случай сбоя мастер сервера

Ссылки

Разделение данных на оперативные данные и архивные.

Таблицы, которые относятся к архивным данным хранить в схеме zz, таблспейсы HST_DATA, HST_INDX

Верификация

Последняя версия скриптов для верификации именования и расположения объектов находятся на SVN IBIS/trunk/ER3/DB/LocalScripts На данный момент это:

  • правильные имена constraint (Constraint_name.sql) - делает сразу правильные
  • правильные имена index (Index_name.sql) (делает сразу правильные)
  • функции у которых нет комментария Check_comments\funct_desc_check.sql
  • таблицы у которых нет комментариев Check_comments\table_desc_check.sql
  • для всех объектов овнер должен быть MIS_USER (select mm.mis_user_owner)

Ссылки