teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

修正

2017/10/03 06:24

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -38,7 +38,7 @@
38
38
  基本となる構成要素も検索対象にするならB_id[]にはB_idも含めます。
39
39
  含めないならB_id[]は空にしておけば検索対象にはなりません。
40
40
 
41
- で、b_idのGinインデックスを作成し、
41
+ で、B_id[]のGinインデックスを作成し、
42
42
  ```
43
43
  where B_id[]@>array[30,32] -- B_id[]は便宜上の表現
44
44
  ```

5

追記

2017/10/03 06:24

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -7,10 +7,12 @@
7
7
  追記
8
8
  ---
9
9
  以下の構造で十分な気がします。
10
+ ```
10
11
  TableA(A_id,Value)
11
12
  TableB(B_id,Value,A_id[])
12
13
  TableC(C_id,Value,A_id[])
13
14
  TableBC(B_id,C_id)
15
+ ```
14
16
  ※BCの組み合わせがあるので、BC追加。
15
17
 
16
18
  この構造であれば、目的の件数取得は以下になります。
@@ -22,4 +24,22 @@
22
24
  select count(*) from TableC where A_id[1]=1
23
25
  --A_id[]をBoolean型とするなら
24
26
  select count(*) from TableC where A_id[1]
25
- ```
27
+ ```
28
+ 追記2
29
+ --
30
+ 以前提案していた構造を今回のもので表すと
31
+ ```
32
+ TableA(A_id,Value)
33
+ TableB(B_id,Value,B_id[],A_id[])
34
+ ```
35
+ となります。
36
+ TableBはBとCを合わせたもので、B_id[]が分子構造の構成要素になります。
37
+ 元々のTableBの識別が必要なら、属性項目を持たせた方が良いでしょう。
38
+ 基本となる構成要素も検索対象にするならB_id[]にはB_idも含めます。
39
+ 含めないならB_id[]は空にしておけば検索対象にはなりません。
40
+
41
+ で、b_idのGinインデックスを作成し、
42
+ ```
43
+ where B_id[]@>array[30,32] -- B_id[]は便宜上の表現
44
+ ```
45
+ のようにすれば良いのではないかと。

4

修正

2017/10/03 04:16

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -1,4 +1,4 @@
1
- > 引用テキストTable BCのレコード(31, 502), (32, 502)はA_id=1由来で登録したレコードなので
1
+ > Table BCのレコード(31, 502), (32, 502)はA_id=1由来で登録したレコードなので
2
2
 
3
3
  このことが分かる条件が無い限り無理でしょう。
4
4
  c_idが識別可能なルールで採番されているなら条件として使用できますが、

3

追記

2017/10/03 03:14

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -9,7 +9,9 @@
9
9
  以下の構造で十分な気がします。
10
10
  TableA(A_id,Value)
11
11
  TableB(B_id,Value,A_id[])
12
- TableC(C_id,Value,B_id,A_id[])
12
+ TableC(C_id,Value,A_id[])
13
+ TableBC(B_id,C_id)
14
+ ※BCの組み合わせがあるので、BC追加。
13
15
 
14
16
  この構造であれば、目的の件数取得は以下になります。
15
17
  ```SQL

2

追記

2017/10/03 03:10

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -14,4 +14,10 @@
14
14
  この構造であれば、目的の件数取得は以下になります。
15
15
  ```SQL
16
16
  select count(*) from TableC where A_id @> array[1]
17
+ ```
18
+ 配列の個数をA_idと対比させ固定するなら以下のようになります。
19
+ ```SQL
20
+ select count(*) from TableC where A_id[1]=1
21
+ --A_id[]をBoolean型とするなら
22
+ select count(*) from TableC where A_id[1]
17
23
  ```

1

追記

2017/10/03 03:03

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -2,4 +2,16 @@
2
2
 
3
3
  このことが分かる条件が無い限り無理でしょう。
4
4
  c_idが識別可能なルールで採番されているなら条件として使用できますが、
5
- そうでなければ、table cにその識別が必要かと思います。
5
+ そうでなければ、table cにその識別が必要かと思います。
6
+
7
+ 追記
8
+ ---
9
+ 以下の構造で十分な気がします。
10
+ TableA(A_id,Value)
11
+ TableB(B_id,Value,A_id[])
12
+ TableC(C_id,Value,B_id,A_id[])
13
+
14
+ この構造であれば、目的の件数取得は以下になります。
15
+ ```SQL
16
+ select count(*) from TableC where A_id @> array[1]
17
+ ```