[Sarlug] PostgreSQL: списки ссылок на поле другой таблицы

BatraevEM BatraevEM на mail.ru
Ср Янв 21 11:19:41 MSK 2015


Доброго...

Мне кажется слишком усложняешь для уровня SQL.

если бизнес логику будешь делать на sql лучше делать так
table elements <many-to-many over table> table documents
- потом проще будет логику на sql делать, и переносимость будет выше.
например:
CREATE TABLE tntp
(
  id serial NOT NULL,
  name character varying(128) NOT NULL,
  CONSTRAINT tntp_pkey PRIMARY KEY (id)
)

CREATE TABLE tntp_tp
(
  id serial NOT NULL,
  tntp_id integer NOT NULL,
  ttp_id integer NOT NULL,
  CONSTRAINT tntp_tp_pkey PRIMARY KEY (id),
  CONSTRAINT tntp_tp_tntp_id_fkey FOREIGN KEY (tntp_id)
      REFERENCES tntp (id) MATCH SIMPLE,
  CONSTRAINT tntp_tp_ttp_id_fkey FOREIGN KEY (ttp_id)
      REFERENCES ttp (id) MATCH SIMPLE,
  CONSTRAINT tntp_tp_tntp_id_key UNIQUE (tntp_id, ttp_id)
)

CREATE TABLE ttp
(
  id serial NOT NULL,
  name character varying(128) NOT NULL,
  code character varying(20) NOT NULL,
  CONSTRAINT ttp_pkey PRIMARY KEY (id)
)

здесь промежуточная таблица tntp_tp для связи многие ко многим tntp и
ttp.


Если бизнес логика будет в отдельной программе то, скорее всего,
действитьлно лучше смотреть в сторону nosql и acid делать на уровне
программы.

например mongodb очень архитектурно красив в плане обработки
документов.

например документ в монгодб:

{
    "_id" : ObjectId("529c826c222115c5c72e57cc"),
    "handlers" : [ 
        {
            "args" : {
                "ext" : 120,
                "jn" : 5,
                "oids" : [ 
                    "sysDescr", 
                    "sysUpTime", 
                    "sysName", 
                    "sysContact", 
                    "sysLocation", 
                    "sysObjectID"
                ]
            },
            "func" : "snmp_poll"
        }, 
        {
            "func" : "update_objects"
        }
    ],
    "ldt" : ISODate("2015-01-21T11:12:00.000Z"),
    "name" : "System",
    "period" : "5m",
    "status" : "on"
}

по любым полям можно делать индексы, вообще все очень быстро, но
связывание документов и полей вообще никакое, поэтому в каждом
документе нужно/лучше/быстрее хранить все.

Если бы я сейчас начинал некоторые свои проекты с нуля поигрался бы с
json в postgresql.

Нужно еще учесть объемы и нагрузку, возможно, если нужна высокая
скорость при больших нагрузках, то стоит забить на какие-то пункты из
acid. Если же к системе будет 5-10 обращений в минуту и плевать что
ответ формируется за 0.1-0.6 секунду (то есть не нужна обязательно
0.001 секунда), то сделай как можно проще для sql - самый первый
вариант. У мну есть хернюшка которую я делал вообще на django с его
самым медленным orm, но работает без особых проблем на базе в 5 Гб - к
нему редко обращаются и ответ моментально не требуется...

Вообще нужно учитывать, что все что заложешь сейчас в основание потом
будет приследовать всю жизнь. Гарантированно через время (весьма
короткое) эксплуатации в боевом режиме вылезут
проблемы/доработки/красивости/удобства которые сейчас предусмотреть
очень трудно - поэтому все используемые технологии должны давать
возможность легкой модификации, причем желательно без кардинальной
переработки. Тут конечно большой плюс у носиквела без схем данных. С
другой стороны и постгресе можно сделать универсальную таблицу в ней
почти все хранить, например:

  id bigserial NOT NULL,
  key text,
  type text,
  val text,
  cdt timestamp without time zone,
  rem text



В Wed, 21 Jan 2015 08:47:00 +0400
NIR <faust на gmx.com> пишет:

> Друг рассказывал. Также рассказал, что там нет системы транзакций. Я
> посчитал, что в моём случае это станет критичным.
> 
> 21.01.2015 08:53, Eugene Horohorin пишет:
> про no-SQL знаешь?
> 
> 2015-01-20 20:12 GMT+03:00 Dmitry Agafonov <agafonovdmitry на gmail.com>:
> 
> Лично я бы рекомендовал не думать на уровне SQL, а думать на уровне
> пользовательского интерфейса своей системы.
> Обычно его делают на неких фреймворках, где есть связки с базой и
> часто в составе есть (можно подобрать) ORM для отображения база
> данных <=> программные объекты.
> Исходить надо из того, какая структура нужна/генерируется для этого
> ORM.
> 
> В противном случае можно получить "ну не сложно же было сделать"
> нечто, что будет очень сложно дебажить, расширять и дорабатывать.
> 
> Также сразу надо иметь в виду возможные (вероятность 100% по опыту ;)
> ) миграции структуры базы и данных. В некоторых ORM оно есть в
> каком-то виде.
> 
> 
> 20 января 2015 г., 18:18 пользователь NIR <faust на gmx.com> написал:
> 
>  Всем привет.
> 
> С невеликим успехом пытаюсь писать ERP-PLM-PDM систему для завода.
> Поставил PostgreSQL и начал думать над структурой БД.
> 
> Дано:
> - Список документов. Для простоты представим, что в системе все
> документы представлены таблицей document с полями id (primary key),
> uri и name.
> 
> - Список элементов, представленный таблицей elements с полями id
> (primary key), name и documents[]. Это может быть какая-то деталь,
> например, кронштейн. К данной детали необходимо привязать список
> документов (чертёж, спецификация, стандарт на крутящие моменты,
> качество ЛКП и прочего). Я пытаюсь сделать это через хранение массива
> documents[] типа bigint с id документов. Планирую разворачивать этот
> список в программе в имена документов.
> 
> - Структура элементов, представляющая собой таблицу mbom с полями id
> (primary key) и structure. Поле structure имеет тип ltree
> (используется модуль ltree из PostgreSQL) и в качестве элементов
> дерева используются id таблицы elements. Эти id также планирую
> разворачивать в программе в имена(дерево) элементов, образующие
> крупные узлы продукции (локомотив).
> 
> Вопрос:
> Основной вопрос формулируется как: А правильно ли я вообще это сделал?
> Может, есть способ получше?
> 1) Можно ли SQL запросом обратиться к массиву documents[] таблицы
> elements и по указанным там номерам раскрыть список документов? Не
> хочу писать логику разбора массива в программе.
> 2) Можно ли обратиться к полю structure таблицы mbom и по номерам
> ракрыть список соответствующих элементов? Мотивировано тем же самым
> нежеланием писать логику в программе. Хочу просто список из таблицы
> elements.
> 
> В SQL соображаю  на уровне CREATE TABLE/ INSERT INTO.
> 
> P. S.: Для работы используется Pgtcl из собственно интерпретатора Tcl.
> P. P. S.: Могу попробовать нарисовать диаграмму того, что хочу
> получить.
> 
> --
> С уважением, Игорь Чудов
> Энгельсский Инструментальный Завод "ЭИЗ"
> Сайт: http://nir.org.ru/
> Телефон: +7 937 266-51-34
> 
> 
> _______________________________________________
> Sarlug mailing list
> Sarlug на lists.lug.ru
> https://lists.lug.ru/mailman/listinfo/sarlug
> 
> 
> 
> 
> --
> Dmitry Agafonov ~ http://agafonov.pp.ru/
> 
> _______________________________________________
> Sarlug mailing list
> Sarlug на lists.lug.ru
> https://lists.lug.ru/mailman/listinfo/sarlug
> 
> 
> 
> 
> 
> 
> _______________________________________________
> Sarlug mailing list
> Sarlug на lists.lug.ru
> https://lists.lug.ru/mailman/listinfo/sarlug
> 



Подробная информация о списке рассылки Sarlug