質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

3421閲覧

PostgreSQLのスキーマについて

sityu

総合スコア37

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2016/08/16 01:22

###質問
現在OSS-DB Silverの勉強をしているのですが、
スキーマ検索パスについて質問させてください。

公式サイトの例題解説にて、スキーマ検索パスの問題を解きました。
その中でfooというユーザで下記のSQLを打った時の状況です。

SET search_path TO “$user”,bar,public; SELECT * from sample; ※この前にいくつかのスキーマ名を指定したsampleにデータを入れています。

このとき、スキーマ名を省略した場合はSETしたsearch_pathの優先度が高いものが選ばれて出力されるとありました。
では、search_pathを複数設定することは何の意味があるのでしょうか?

手元に実機がない為検証できていないのですが、
search_pathが通っていないスキーマにはアクセスできないという認識でいいのでしょうか?

初歩的な質問かもしれませんが、宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

一例として、
共通テーブルやマスタテーブルをpublicとして、個々のテーブルを各スキーマに分けて同じテーブル定義でデータの分離に使ったりしました、(個々は店舗単位だったり)。
ログインユーザに引っ掛けてスキーマを定義して、プログラムはログイン(CONNECT)で可変にすれば、それぞれが独自のテーブルを持ち共通テーブルも使える様にしておりました。
かつてのDBがお高い頃で、一つのDBにテスト用のスキーマなど作成して、本番スキーマとデータの分離をさせたりもしてました。
結構スキーマの管理が大変だったと思います。なので私は今は余り使っていません。

投稿2016/08/18 02:50

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sityu

2016/08/18 03:06

ありがとうございます。 例えば、ユーザの操作履歴を残す際にユーザIDなどでスキーマをわけると 操作履歴の検索速度は格段に変わると思っていいのでしょうか?
A.Ichi

2016/08/18 03:17

RDBは、データ量が大きくパフォーマンスに影響しますので分けると速度は速くなります。履歴系(Postgres)ならパーティションでも出来ます。パーティションは、100個以下がよろしいかと。
sityu

2016/08/18 03:28

わかりやすく理解できました。 ありがとうございました!
guest

0

SELECT文などでアクセスするテーブルは、本来どのオーナーのどのテーブル・ビューなのかを示すためにSELECT * FROM public.table_aみたいな書き方になりますが、search_path を設定することによってpublic.の部分を省略して書けるようになる、というのがひとつ目のメリット。(ちょっとでもSQL文が短くなって読みやすくなります。)

publicの他、他のオーナーも同じ名前のテーブルやビューを持っている場合でも、search_path を設定することによって自分にとってのテーブルはどこから探すかを明示できるようになる、というのがふたつ目のメリット。(私にとってtable_aはpublic配下にあってもbar配下にあっても自分のところのを使うぞという宣言。)

でも、(アクセス可能な権限が与えられていれば)オーナー名付きでfooさんがSELECT * FROM bar.table_aも実行できるので、SQL文の可読性を上げることの意味が強い気がします。

参考:18.11. クライアント接続デフォルト
http://www.postgresql.jp/document/9.5/html/runtime-config-client.html#runtime-config-client-statement

投稿2016/08/16 01:57

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sityu

2016/08/18 03:08

回答ありがとうございます。 search_pathを複数設定する意味はどこにあるのでしょうか? 仮に foo,bar,publicと設定した場合に、fooスキーマが無ければbarスキーマを見るという意味合いでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問