PostgreSQL связывание и отключение строк по цепочке - PullRequest
0 голосов
/ 25 мая 2020

Документ может называться членом семьи, если он имеет общий docid.

Простое сопоставление выглядит так:

Docs: docid
1 : a,b
2 : a,c,d
3 : d,e,f
4 : b,g

в таблице эти данные выглядят так:

1 = a
1 = b
2 = a
2 = c
2 = d
3 = d
3 = e
3 = f
4 = b
4 = g

Здесь 1,2,3,4 Документы являются семейством, так как у них есть общие, например: 1 и 2 имеют общий «a», 2 и 3 имеют общий «d», а 1 и 4 имеют общий «b».

Я могу добиться этой группировки, сделав для нее отдельную таблицу и при вставке проверки, существует ли какая-либо запись, а затем присвоив существующее значение всем docid.

When doc 1 is inserted :
checks any of (a,b) already in family table:
if no:
  insert into table and get a famid

следовательно, вставляет: a = 1 и b = 1 строки.

и для других случаев, например, do c 2 case

: any (a,c,d) exists --> doc 1 has been inserted hence output : a = 1

so take this value and assign to a,c,d (separate entries: a=1, c=1, d=1)and upsert into family table. 

Таким образом, таблица семейств выглядит так:

Docs : docid : famid
1    :   a   :  1
1    :   b   :  1
2    :   c   :  1
2    :   d   :  1
3    :   e   :  1
3    :   f   :  1
4    :   g   :  1

Я хочу сохранить это, чтобы поддерживать группу, чтобы в этом случае, если у меня есть c 1,2,3,4, я мог сгруппировать по famid и вернуть любой из этих 4 документов.

Меня беспокоит , что этот docid может содержать ручную ошибку, поэтому через несколько дней "a" может отсоединиться от doc1, поэтому логически документы 2 и 3 больше не должны быть членами семьи famid 1, но семейная таблица все еще хранит его, следовательно, вся цепочка будет повреждена, есть ли способ, которым я могу сохранить и поддерживать, чтобы разъединить связь в случае удаления общего узла в цепочке.

...