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

Материал из ИбисоПедии
Перейти к: навигация, поиск
(2. Индексы)
 
(не показано 35 промежуточных версий 3 участников)
Строка 29: Строка 29:
 
см pg_script в которой есть скрипты для правильного именования объектов.
 
см pg_script в которой есть скрипты для правильного именования объектов.
  
TODO Также необходимо добавить скрипты для проверки достаточности комментариев на основе MIS2:
+
см скрипты на svn IBIS\trunk\ER3\DB\LocalScripts\
* "MIS2\DOC\DB\SCRIPTS\Column - Правит комментарии к ID.sql"  
+
 
* "MIS2\DOC\DB\SCRIPTS\Column - Столбцы без комментария.sql"
+
 
* "MIS2\DOC\DB\SCRIPTS\Columns - Неправильные комментарии к ID.sql"
+
TODO Также необходимо добавить скрипты для проверки достаточности комментариев на аналогичные АИДС:
* "MIS2\DOC\DB\SCRIPTS\Table - Неправильные комментарии к таблицам.sql"
+
* "DOC\DB\SCRIPTS\Column - Правит комментарии к ID.sql"  
 +
* "DOC\DB\SCRIPTS\Column - Столбцы без комментария.sql"
 +
* "DOC\DB\SCRIPTS\Columns - Неправильные комментарии к ID.sql"
 +
* "DOC\DB\SCRIPTS\Table - Неправильные комментарии к таблицам.sql"
  
 
== Соглашение об именовании  ==
 
== Соглашение об именовании  ==
Строка 47: Строка 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'''
Строка 60: Строка 63:
  
 
1.9. Таблицы копии %TABLE%_YYMMDD
 
1.9. Таблицы копии %TABLE%_YYMMDD
 +
 +
1.10. Не рекомендуется в названиях столбцов использовать отрицательную частицу (not и.т)
  
 
=== 2. Индексы ===
 
=== 2. Индексы ===
Строка 80: Строка 85:
 
=== 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. Другие объекты ===
Строка 102: Строка 112:
 
=== 6. PqSQL Variables ===
 
=== 6. PqSQL Variables ===
  
6.1. Package Global Variables: g_variable_name
+
6.1. Package Global Variables: g_variable_name <br>
 
+
6.2. Local Variables        : v_variable_name <br>
6.2. Local Variables        : l_variable_name
+
6.3. Types                  : t_type_name <br>
 
+
6.4. Cursors                : c_cursor_name <br>
6.3. Types                  : t_type_name
+
6.5. Exceptions              : e_exception_name <br>
 
+
6.6. Input Parameters        : i_parameter_name <br>
6.4. Cursors                : c_cursor_name
+
6.7. Outut Parameters        : o_parameter_name<br>
 
+
6.8. In/Out Parameters      : io_parameter_name <br>
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. Процедуры, функции ===
  
7.1. При объявлении переменных в заголовке обязателен префикс p_. Это избавит от неоднозначности при компиляции
+
7.0. Имя функции должно начинаться с имени сущности. Например addr_clone <br>
+
7.1. При объявлении переменных в заголовке обязателен префикс p_. Это избавит от неоднозначности при компиляции <br>
 
+
7.2. Переменные внутри PL/SQL блока должны иметь префикс v_. Это избавит от неоднозначности при компиляции<br>
7.2. Переменные внутри PL/SQL блока должны иметь префикс v_. Это избавит от неоднозначности при компиляции
+
7.3. Процедуры изменяющие данные в таблицах, должны содержать '''DO''' <br>
+
7.4. Функции, возвращающие значение должные должны содержать '''GET''' <br>
 
 
7.3. Процедуры изменяющие данные в таблицах, должны содержать '''DO'''
 
 
 
 
7.4. Функции, возвращающие значение должные должны содержать '''GET'''
 
 
 
 
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">
 
тут пока пусто
 
</source>
 
  
 
=== 8. Объекты связанные с аудитом данных ===
 
=== 8. Объекты связанные с аудитом данных ===
* Весь аудит храниться в схеме audit.Для преобразования данных из hstore в русские названия используются %table_name_hstore_transform%
+
* Весь аудит храниться в схеме audit.Для преобразования данных из hstore в русские названия используются %table_name_hstore_transform%. См статью [[Аудит в MIS3]]
  
 
=== 9. Сводная таблица правил ===
 
=== 9. Сводная таблица правил ===
Строка 360: Строка 313:
 
| отчет
 
| отчет
 
|-
 
|-
| Required
+
| Request
 
| REQ
 
| REQ
|  
+
| Запрос
 
|-
 
|-
 
| Section
 
| Section
Строка 401: Строка 354:
 
* Пользователь SOFTMASTER имеет очень сложный пароль и под ним никто не должен логиниться.
 
* Пользователь SOFTMASTER имеет очень сложный пароль и под ним никто не должен логиниться.
 
* Логины (ВСЕГДА БОЛЬШИМИ БУКВАМИ!) postgresql формируются по правилу X+<логин большими буквами в системе МИС>
 
* Логины (ВСЕГДА БОЛЬШИМИ БУКВАМИ!) postgresql формируются по правилу X+<логин большими буквами в системе МИС>
* Пользователь SOFTMASTER (БОЛЬШИМИ БУКВАМИ) обладает всеми правами и является владельцем всех объектов (из под него ставиться БД)
+
* Пользователь SOFTMASTER (БОЛЬШИМИ БУКВАМИ) обладает всеми правами (из под него ставиться БД)
  
  
Строка 411: Строка 364:
 
|-
 
|-
 
| MIS_USER  
 
| MIS_USER  
| Роль которой обладают все пользователи МИС. Дает необходимые права для работы в системе
+
| Роль которой обладают все пользователи МИС. Дает необходимые права для работы в системе. Является владельцем всех объектов
 
|-
 
|-
 
|  
 
|  
Строка 431: Строка 384:
 
| Аудит данных. История изменения
 
| Аудит данных. История изменения
 
|-
 
|-
| ht
+
| zz
 
| Архивные данные
 
| Архивные данные
 
|-
 
|-
 
| rls
 
| rls
| база данных РЛС - реестр лекарственных средств России
+
| база данных РЛС - реестр лекарственных средств России (РЛС). Только для чтения. Есть импорт данных
|-
 
| oms
 
| выгрузка ОМС
 
 
|-
 
|-
 
| nsi
 
| nsi
Строка 447: Строка 397:
 
|-
 
|-
 
| oms
 
| oms
| данные по выгрзке в ФОМС
+
| данные по выгурзке в ФОМС
 +
|-
 +
| nsi
 +
| Нормативно справочная информация. Есть возможность загружать из nsi.rosminzdrav.ru
 +
|-
 +
| ismlp
 +
| Схема для объектов ИСЛМП
 +
|-
 +
| iemk
 +
| Объекты для работы с ИЭМК ХМАО
 +
|-
 +
| isar
 +
| Выгрузка диспансеризации ХМАО
 +
 
  
 
|}
 
|}
Строка 485: Строка 448:
  
 
== Резервное копирование ==
 
== Резервное копирование ==
 +
 +
* pg_basebackup + wal archive на неделю (для возможности отката базы на любое время в течении недели назад)
 +
* pg_dump раз в неделю с аккуратно настроенными политиками хранения архивов (на случай если попросят восстановить базу чтобы что то посмотреть например на начало 2010 года).
 +
* hot standby на случай сбоя мастер сервера
 +
 +
Ссылки
  
 
* http://habrahabr.ru/post/197742/
 
* http://habrahabr.ru/post/197742/
Строка 490: Строка 459:
 
== Разделение данных на оперативные данные и архивные. ==
 
== Разделение данных на оперативные данные и архивные. ==
  
Таблицы, которые относятся к архивным данным хранить в схеме ht, таблспейсы HST_DATA, HST_INDX
+
Таблицы, которые относятся к архивным данным хранить в схеме zz, таблспейсы HST_DATA, HST_INDX
  
 
== Верификация ==
 
== Верификация ==
  
Скрипты для верификации именования и расположения объектов находятся на SVN IBIS/trunk/ER3/DB/LocalScripts На данный момент это:
+
Последняя версия скриптов для верификации именования и расположения объектов находятся на SVN IBIS/trunk/ER3/DB/LocalScripts На данный момент это:
* правильные имена constraint
+
* правильные имена constraint (Constraint_name.sql) - делает сразу правильные
* правильные имена index
+
* правильные имена index (Index_name.sql) (делает сразу правильные)
 
+
* функции у которых нет комментария Check_comments\funct_desc_check.sql
<source lang="sql">
+
* таблицы у которых нет комментариев Check_comments\table_desc_check.sql
DO $$
+
* для всех объектов овнер должен быть MIS_USER (select mm.mis_user_owner)
DECLARE
 
--  v_rec record;
 
  v_rec_ref record;
 
  v_rule_name varchar(255);
 
  v_sql TEXT;
 
BEGIN
 
  -- делает правильные имена на все констраинты по схеме mm
 
  -- Author: Zhukov
 
    for v_rec_ref in (
 
    SELECT distinct tc.constraint_name,
 
          tc.table_name,
 
          kcu.column_name,
 
          ccu.table_name AS foreign_table_name,
 
          ccu.column_name AS foreign_column_name
 
    FROM information_schema.table_constraints AS tc
 
        JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name =
 
          kcu.constraint_name
 
        JOIN information_schema.constraint_column_usage AS ccu ON
 
          ccu.constraint_name = tc.constraint_name
 
    WHERE constraint_type = 'FOREIGN KEY' and
 
          tc.constraint_schema = 'mm'
 
          )
 
    LOOP
 
      v_rule_name := 'fk_'||v_rec_ref.table_name||'$'||v_rec_ref.foreign_table_name||'$'||v_rec_ref.column_name;
 
      v_rule_name := substr(v_rule_name,1,63);
 
      if v_rule_name <> v_rec_ref.constraint_name then
 
        v_sql :='alter table mm.' ||v_rec_ref.table_name || ' RENAME CONSTRAINT "'||v_rec_ref.constraint_name || '" TO ' || v_rule_name;
 
        RAISE NOTICE '%', v_sql;
 
        EXECUTE v_sql;
 
 
 
      end if;
 
 
 
    END LOOP;  -- v_rec_ref
 
END$$
 
LANGUAGE 'plpgsql';
 
</source>
 
 
 
<source lang="sql">
 
DO $$
 
DECLARE
 
  v_rec record;
 
  v_rec_ref record;
 
  v_rule_name varchar(255);
 
  v_sql TEXT;
 
  v_pref TEXT;
 
BEGIN
 
  -- делает правильные имена на все индексы
 
  FOR v_rec IN (
 
  SELECT i.relname as indname,
 
      i.relowner as indowner,
 
      idx.indrelid::regclass,
 
      am.amname as indam,
 
      idx.indkey,
 
      array_to_string(ARRAY
 
      (
 
        SELECT pg_get_indexdef(idx.indexrelid, k + 1, true)
 
        FROM generate_subscripts(idx.indkey, 1) as k
 
        ORDER BY k
 
      ), '$') AS columns_str,
 
      idx.indexprs IS NOT NULL as indexprs,
 
      idx.indpred IS NOT NULL as indpred,
 
      idx.indisunique,
 
      idx.indisprimary,
 
      t.relname as "table_name",
 
      ns.nspname
 
FROM pg_index as idx
 
    JOIN pg_class as i ON i.oid = idx.indexrelid
 
    JOIN pg_am as am ON i.relam = am.oid
 
    JOIN pg_namespace as ns ON ns.oid = i.relnamespace AND ns.nspname = 'mm'
 
    join pg_class t on idx.indrelid = t.oid
 
    where idx.indexprs is null  -- исключаем индексы с функциями
 
    )
 
  LOOP
 
    -- вычислемя префикс
 
    if v_rec.indisprimary then
 
      v_pref := 'pk';
 
    elsif v_rec.indisunique then
 
      v_pref := 'iu';
 
    else
 
      v_pref := 'ix';
 
    end if;
 
 
 
    v_rule_name := v_pref || '_' ||v_rec.table_name ||'$'||v_rec.columns_str;
 
    if v_rule_name <>  v_rec.indname then
 
    -- нужно барть в кавычки имя инндекса
 
      v_sql := 'alter index "' || v_rec.nspname ||'"."' || v_rec.indname || '" rename to "' || v_rule_name || '"';
 
      RAISE NOTICE '%', v_sql;
 
      EXECUTE v_sql;
 
    end if;
 
 
 
  END LOOP; --v_rec
 
END$$
 
LANGUAGE 'plpgsql';
 
 
 
== Расширения postgresql ==
 
Используются следующие стандартные расширения (должны работать на всех ОС):
 
* hstore
 
* ltree
 
* tablefunc
 
 
 
 
 
</source>
 
  
 
== Ссылки ==
 
== Ссылки ==
 +
* http://www.sqlstyle.guide
  
 
[[Категория:Руководство программиста MIS3]]
 
[[Категория:Руководство программиста MIS3]]
 
[[Категория:Postgresql]]
 
[[Категория: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)

Ссылки