
Vladislav
21.07.2018
19:36:07

Сергей
21.07.2018
19:39:57

Anton [Mgn, az09@osm]
21.07.2018
19:41:31

Radim
21.07.2018
19:47:10

Google

Vladislav
21.07.2018
20:15:46
@Somezed что называется, решай сам))
https://www.mail-archive.com/pgsql-hackers@postgresql.org/msg253739.html

Aleksander
21.07.2018
22:48:40
Привет пацаны. А можете подсказать, хочу сделать две таблицы, одна из таблиц наследует вторую, у обоих есть поле(одно и то же) с констрой unique. Как сделать так, чтобы гарантировалась уникальность в рамках двух таблиц, а не каждой по отдельности? Пока понимаю, что никак, кроме навешивания триггера - который не всегда будет срабатывать из-за того, что он видит только закоммиченные данные при вставке.


Yaroslav
21.07.2018
22:50:25
Привет пацаны. А можете подсказать, хочу сделать две таблицы, одна из таблиц наследует вторую, у обоих есть поле(одно и то же) с констрой unique. Как сделать так, чтобы гарантировалась уникальность в рамках двух таблиц, а не каждой по отдельности? Пока понимаю, что никак, кроме навешивания триггера - который не всегда будет срабатывать из-за того, что он видит только закоммиченные данные при вставке.
А вы лучше не используйте наследование вообще, по крайней мере, для моделирования.
Привет пацаны. А можете подсказать, хочу сделать две таблицы, одна из таблиц наследует вторую, у обоих есть поле(одно и то же) с констрой unique. Как сделать так, чтобы гарантировалась уникальность в рамках двух таблиц, а не каждой по отдельности? Пока понимаю, что никак, кроме навешивания триггера - который не всегда будет срабатывать из-за того, что он видит только закоммиченные данные при вставке.
А почему, кстати, триггер не будет срабатывать?

Aleksander
21.07.2018
22:52:07

Yaroslav
21.07.2018
22:53:40

Aleksander
21.07.2018
22:54:12
А почему, кстати, триггер не будет срабатывать?
Два треда, делают инсерт записи с одинаковым уникальным полем, один в родительскую таблицу, другой в дочернюю. Оба вызвали триггер, он вернул, что запись уникальная. оба сделали коммит, итог запись с уникальным полем задвоена

Dmitry
21.07.2018
22:54:56

Yaroslav
21.07.2018
22:56:06
Два треда, делают инсерт записи с одинаковым уникальным полем, один в родительскую таблицу, другой в дочернюю. Оба вызвали триггер, он вернул, что запись уникальная. оба сделали коммит, итог запись с уникальным полем задвоена
А, да, но только для низких уровней изоляции. Но с ними вообще приходится долбаться вместо того, чтобы просто писать, IMHO... ;)

Aleksander
21.07.2018
22:56:33

Dmitry
21.07.2018
22:56:50

Aleksander
21.07.2018
22:57:07
Хорошая идея с вьюхами, надо проработать

Google

Yaroslav
21.07.2018
22:58:04

Dmitry
21.07.2018
22:59:52
Хорошая идея с вьюхами, надо проработать
Если доводить идею до логического конца, то надо определить инварианты на физическом уровне с помощью check contraint. Это тем сложнее, чем больше типов сущностей может хранить таблица.

Yaroslav
21.07.2018
23:02:13

Aleksander
21.07.2018
23:02:25

Dmitry
21.07.2018
23:02:38

Yaroslav
21.07.2018
23:04:12

Aleksander
21.07.2018
23:05:05
Ну тогда совсем не сложно будет.
ну да, мне на самом деле уже понравилась эта идеа с вьюхами. А на инсерт можно просто навесить триггеры на вьюхи, которые будут тип проставлять
Спасибо

Yaroslav
21.07.2018
23:06:08

Aleksander
21.07.2018
23:07:27

Yaroslav
21.07.2018
23:08:14

Aleksander
21.07.2018
23:10:18

Dmitry
21.07.2018
23:12:22

Yaroslav
21.07.2018
23:13:21

Aleksander
21.07.2018
23:15:19
Конкретный пример очень просто. Каналы ютуб и пользователи ютуб. В ютубе пользователь и канал это по сути одно и тоже, разница только в том, что у канала есть видео, а у пользователя их нет, до момента пока он его не сделает - и не станет для меня каналом


Yaroslav
21.07.2018
23:17:51
Помогают обеспечить гарантию целосности. Конкретный пример - таблица "персона" хранит данные, общие для всех персон (фио), специфические данные мужчин и специфические данные женщин. В этой таблице есть поле типа, которое при определении инварианта входит в check constraint - если тип "м", то все поля типа "ж" обязаны быть null. И наоборот.
Да, это помогает обеспечить консистетность данных, но только в этой таблице. Мне в этой модели не нравится ссылочная целостность. К примеру, таблица записей на приём к гинекологу должна ссылаться только на женщин, и как это обеспечить?
Я вот видел такое решение: В percona добавляется (только для ссылок) уникальный индекс (id, пол), а в таблице приёмов — поле "пол" (с constraint = "ж"), и FK (id, пол) на percona(id, пол)... Но это даже выглядит очень тупо. :(

Google

Dmitry
21.07.2018
23:22:59
Да, это помогает обеспечить консистетность данных, но только в этой таблице. Мне в этой модели не нравится ссылочная целостность. К примеру, таблица записей на приём к гинекологу должна ссылаться только на женщин, и как это обеспечить?
Я вот видел такое решение: В percona добавляется (только для ссылок) уникальный индекс (id, пол), а в таблице приёмов — поле "пол" (с constraint = "ж"), и FK (id, пол) на percona(id, пол)... Но это даже выглядит очень тупо. :(
Да, есть такая проблема. Но это один из работающих подходов, работать с которым относительно просто. Самый серьёзный недостаток этого подхода проявляется при добавлении других типов сущности, когда в таблице уже миллионы записей.

Yaroslav
21.07.2018
23:26:09

Dmitry
21.07.2018
23:26:39

Yaroslav
21.07.2018
23:28:24
Их нет. Как нет ничего идеального.
О, для многих простых моделей ещё как есть (вон, целая теория нормализации). ;)
Но про то, как моделировать отношение "A является B", в ней, похоже, вообще ничего нет. :(

Aleksander
21.07.2018
23:30:36
Это хорошо, что в задаче одна база =)А когда есть целый зоопарк, обеспечивать различные гарантии становится невыносимо.

Dmitry
21.07.2018
23:32:05

Yaroslav
21.07.2018
23:38:28


Dmitry
21.07.2018
23:43:43
А почему вы думаете, что я не идеалист? ;)
Я вот, например, на практике перепробовал почти все эти подходы... и каждый раз мне потом казалось "нет, ну опять что-то нехорошо... уж в следующий раз сделаю как-то иначе, лучше как-то". Но вот что-то нет. :(
Да и (почти всегда) то, что "есть много способов сделать <конкретно вот это>" обычно говорит только о том, что лучшего не найдено (либо вообще нет). :(
На самом деле, у большинства творческих личностей есть особенность работать на пределе своих возможностей. Это как раз то, о чём Вы говорите. Стремление найти бескомпромисное решение - это похвально, т.к. это путь к появлению чего-то до селе не созданного, однако часто это идёт в разрез временных рамок и прочих ограничений реальности.
Ничего идеального на практике нет и быть не может. В узкой сфере IT, которая ещё вообще находится в стадди зародыша - тем более.


Yaroslav
21.07.2018
23:50:47
На самом деле, у большинства творческих личностей есть особенность работать на пределе своих возможностей. Это как раз то, о чём Вы говорите. Стремление найти бескомпромисное решение - это похвально, т.к. это путь к появлению чего-то до селе не созданного, однако часто это идёт в разрез временных рамок и прочих ограничений реальности.
Ничего идеального на практике нет и быть не может. В узкой сфере IT, которая ещё вообще находится в стадди зародыша - тем более.
> Ничего идеального на практике нет и быть не может.
Ну, вот тут не соглашусь. Для многих конкретных задач (для сотен, а может, уже и тысяч их!) уже найдены лучшие решения (я про алгоритмы... и не только про них, кстати) , т.е. лучшее уже есть, и ничего другого уже не будет. ;)
А, возвращаясь к теме... вы видели какие-нибудь "необычные" модели для наследования (или чего-то ему подобного), или же какие-нибудь здравые идеи по обеспечению ссылочной целостности на эту тему?


Dmitry
22.07.2018
00:03:20
> Ничего идеального на практике нет и быть не может.
Ну, вот тут не соглашусь. Для многих конкретных задач (для сотен, а может, уже и тысяч их!) уже найдены лучшие решения (я про алгоритмы... и не только про них, кстати) , т.е. лучшее уже есть, и ничего другого уже не будет. ;)
А, возвращаясь к теме... вы видели какие-нибудь "необычные" модели для наследования (или чего-то ему подобного), или же какие-нибудь здравые идеи по обеспечению ссылочной целостности на эту тему?
Я знаю 6 способов реализации наследования. Об одном я уже сказал. Один из других способов - хранить все данные опять же в одной таблице, но для каждого подтипа создать отдельную таблицу, в которой будут храниться только ключи сущностей конкретного типа. И тогда на приём к гинекологу будут попадать только сущности из таблицы "женщины".


Yaroslav
22.07.2018
00:14:31
Я знаю 6 способов реализации наследования. Об одном я уже сказал. Один из других способов - хранить все данные опять же в одной таблице, но для каждого подтипа создать отдельную таблицу, в которой будут храниться только ключи сущностей конкретного типа. И тогда на приём к гинекологу будут попадать только сущности из таблицы "женщины".
Да, вот этот способ мне субъективно нравится больше других. ;)
Или, может быть, его модификация, когда поля, относящиеся, например, только к женщинам ("срок беременности"), хранятся в соответствующей таблице.
Но, как гарантировать следующее:
. Что в какой-либо из таблиц ("женщины" или "мужчины") для данного человека вообще есть запись?
. Что запись есть только в одной из этих таблиц?
Я видел такие решения:
1. Person(id, FK_to_women NULL REFERENCES women, FK_to_men REFERENCES men, <other>) + constraint, что только одно из полей FK должно быть NOT NULL.
2. Просто триггерами, правами доступа и т.п. обеспечить, чтобы вставка шла только через "дочерние" таблицы, и автоматически запись попадала в родительскую (но много ручной работы).
Мне в ней нравится ссылочная целостность — можно просто ссылаться на то, что нужно (таблицу).


Dmitry
22.07.2018
00:19:54
Да, вот этот способ мне субъективно нравится больше других. ;)
Или, может быть, его модификация, когда поля, относящиеся, например, только к женщинам ("срок беременности"), хранятся в соответствующей таблице.
Но, как гарантировать следующее:
. Что в какой-либо из таблиц ("женщины" или "мужчины") для данного человека вообще есть запись?
. Что запись есть только в одной из этих таблиц?
Я видел такие решения:
1. Person(id, FK_to_women NULL REFERENCES women, FK_to_men REFERENCES men, <other>) + constraint, что только одно из полей FK должно быть NOT NULL.
2. Просто триггерами, правами доступа и т.п. обеспечить, чтобы вставка шла только через "дочерние" таблицы, и автоматически запись попадала в родительскую (но много ручной работы).
Мне в ней нравится ссылочная целостность — можно просто ссылаться на то, что нужно (таблицу).
Таблица Person связывается с таблицами Men, Women как 1:1, при этом, на таблицах Men и Woman простые триггеры, которые работают с полем типа Person.type. И потом можно ссылаться на Men и Woman откуда угодно.


Dmitry
22.07.2018
00:26:14
Т.е. без триггеров никак не обойтись. Просто после всех таких телодвижений при работе с пачками таблиц приходит решение хранить все сущности в одной таблице и использовать универсальные триггеры ограничений. Например, на таблице "прием к гинекологу" действует триггер "только женщины". Довольно просто и эффективно.


Yaroslav
22.07.2018
00:29:16
Таблица Person связывается с таблицами Men, Women как 1:1, при этом, на таблицах Men и Woman простые триггеры, которые работают с полем типа Person.type. И потом можно ссылаться на Men и Woman откуда угодно.
> на таблицах Men и Woman простые триггеры, которые работают с полем типа Person.type
А что эти триггеры конкретно проверяют?
Хотя... если использовать person.type, а всё "значимые" поля хранить только в Person, добавить type в men/women (константного значения), можно вообще использовать обычные FK (men <-> person, women <-> person), да и всё. Тупо, конечно, что в наследниках есть поле-константа...
Другие минусы модели — NULL-ов много в основной таблице, и при запросах не так очевидно, какое поле к какому виду объектов отностится.
Зато в остальном, вроде, и тоже ничего. ;) Спасибо!


Dmitry
22.07.2018
00:30:29
> на таблицах Men и Woman простые триггеры, которые работают с полем типа Person.type
А что эти триггеры конкретно проверяют?
Хотя... если использовать person.type, а всё "значимые" поля хранить только в Person, добавить type в men/women (константного значения), можно вообще использовать обычные FK (men <-> person, women <-> person), да и всё. Тупо, конечно, что в наследниках есть поле-константа...
Другие минусы модели — NULL-ов много в основной таблице, и при запросах не так очевидно, какое поле к какому виду объектов отностится.
Зато в остальном, вроде, и тоже ничего. ;) Спасибо!
Был рад пообщаться ) Спокойной ночи, ограничения реальности склоняют меня ко сну )

Yaroslav
22.07.2018
00:30:45

Morphism
22.07.2018
05:12:52
hi, is there anyone who can give a sql beginner some guides for a detail question? thx
I can not speak Russian, but there is almost no active member in the postgresql group for english speakers.

Maksim
22.07.2018
05:43:00
Its 8 am in Moscow eve1 is asleep
Try out sql bolt

Google

Mike Chuguniy
22.07.2018
08:21:31

Subb98
22.07.2018
08:28:48
https://www.datacamp.com/courses/joining-data-in-postgresql

Morphism
22.07.2018
09:31:43

Admin
ERROR: S client not available

Yaroslav
22.07.2018
10:25:25

Igor
22.07.2018
13:51:49
Привет всем! Может кто-нибудь подсказать как правильно создать группу, которая бы обладала правами на изменение схемы?
я правильно понимаю, что это так делается GRANT USAGE ON SCHEMA public TO xxx;

Claudio
22.07.2018
13:58:27
hi there. I have a problem with postgresql. I want to try to synchronize 3 databases accross a central pivot db. For example. If i insert a row in DB1, Db1 send a query to pivot with the extension postgresql_fdw and it send this insert query to db2 and db3. I have create 3 trigger after insert every database (one for database). The problem is: if i send a insert query in db1, the pivot send this query to db2 and db3 but fire alredy the trigger insert in db2 and db3. Infinite loop :). How can i solve this problem? thanx

Dmitry
22.07.2018
15:15:47

Igor
22.07.2018
15:17:32

Dmitry
22.07.2018
15:23:00

Claudio
22.07.2018
15:24:34

Dmitry
22.07.2018
15:27:00

Claudio
22.07.2018
15:29:50
the special column in pivot are idref1 idref2 and idref3. where idrefx is the id of row in the source db. The problem is in insert trigger. When, for example db1 send a data to pivot, the trigger in pivot database send a query to db2 and db3 but db2 and db3 have a insert trigger and send that row alredy to the pivot and the pivot send to db1
it's loop

Dmitry
22.07.2018
15:32:58

Claudio
22.07.2018
15:36:10
can u send me a schematic example?

Dmitry
22.07.2018
15:41:14
--
create type src as enum('db1', 'db2', 'db3');
--
create table pivot(id int not null, propagated_from src null);
create table db1(id int, propagated_from src null);
create table db2(id int, propagated_from src null);
create table db3(id int, propagated_from src null);
--
Then just define your trigger function to check the "propagated_from" column.
If you don't want to add the special column to the dbN tables, then your trigger function can use FDW or dblink to access the "propagated_from" column in the pivot table.

Google

Claudio
22.07.2018
15:44:41
i have thinked for a boolean column in the pivot

Dmitry
22.07.2018
15:45:01

Claudio
22.07.2018
15:45:12
if is true then nothing, if is false then insert row in db2 for example
right?

Dmitry
22.07.2018
15:45:48

Claudio
22.07.2018
15:45:57
cool. i try it now
i have created one column in db1 and 1 column in db2. the condition of trigger is when (new.propagate = false)?
false = not propagated
true = propagated

Dmitry
22.07.2018
15:57:31
But to avoid additional lookup, you can just define the flag column in each dbN and check it with your trigger (in WHEN or in the trigger function).

Claudio
22.07.2018
16:02:51
work man!!!!
thanks a lot

Dmitry
22.07.2018
16:03:22