PostgreSQLデータベースにいくつかの配列列を含む一連のビューを構築しました。次のようにビューの定義は次のとおりです。基本的にPostgreSQLの配列列内の文字列を見つける
create view articles_view as
(select articles.*,
array(select row(people.*)::people
from people
where articles.spubid=people.spubid and
people.stype='Author' and
bactive='t'
order by people.iorder) as authors,
array(select row(people.*)::people
from people
where articles.spubid=people.spubid and
people.stype='Editor' and
bactive='t'
order by people.iorder) as editors,
array(select row(people.*)::people
from people
where articles.spubid=people.spubid and
people.stype='Reviewer' and
bactive='t'
order by people.iorder) as reviewers,
array(select row(status.*)::status
from status
where articles.spubid=status.spubid and
bactive='t') as status
from articles
where articles.bactive='t');
私が何をしたいのか、特定のユーザIDはその配列中に存在するかどうかを決定するために「著者のコラムにiLikeのです。明らかに、私はそのデータ型でiLikeを使うことができないので、別のアプローチを見つける必要があります。ここ
は「著者のアレイ内のデータの例である:
{ "(2373、T、F、F、\" 2011-08-01 11:57:40.696496 \」、 /Pubs/pubs_edit_article.php,\"2011-08-09 15:36:29.281833 \ "、000128343、A00592、著者、Nicholas、K.、Kreidberg、\" \ 123456789、t、Admin、A 、 "Pubs/pubs_edit_article.php、\" 2011年08月01日 11:57:40.706617 \ "、"(2374、t、f、f、\ " -08-09 15:36:29.285428 "、000128343、A00592、著者、2、John、D.、Doe、\"、234567890、t、IT、A、A、A、0、\ " ")"、 "(2381、t、f、f、\" 2011-08-09 14:45:14.870418 \ "、000128343、\" 2011-08-09 15:36:29.28854 \ "、000128 "、"(2383、t、f、f、\、 "、" A "、" A "、" "2011-08-09 15:35:11.845283"、567890123、 "2011-08-09 15:36:29.291388"、000128343、A00592、著者、4、テスト、T、テスタートン、 "、TestTesterton、f、N/A、A、A、A、A"、 "") "")
私ができることを望むのは、ビューを照会し、 123456789 '(配列内のNicholas Kreidbergに割り当てられたユーザーID)が配列に存在します。どのユーザーに割り当てられているか、配列に表示されている場所に関わらず、配列のどこにでも '123456789'が表示されていれば分かります。
上記の条件が真であるかどうかを判断するクエリを作成する方法がわかったら、アプリケーションは単にそのクエリを実行し、行が返された場合、クエリに渡されたユーザーIDがそのパブリケーションの作成者であることがわかりますそれに応じて進んでください。
このトピックで提供できる洞察を前もってありがとうございます。
適切なデータベース構造を使用できない理由はありますか?私。著者のための別のテーブルと、それがm:nの関係の場合は、記事を著者にマッピングするテーブルです。 – ThiefMaster
@ThiefMaster配列はpostgresによって提供されています。その配列内で検索する方法は妥当な質問です。 –
@Dana、それはまだアンチパターンです(正規化なし、可能なインデックスなし、結合は苦痛です、検索は苦痛で遅いです)。 – Johan