<!--
$Header: /usr/prj/pg/cvsroot/doc/doc/src/sgml/extend.sgml,v 1.9 2001/08/24 08:39:15 junichi Exp $
-->

 <chapter id="extend">
  <!-- <title>Extending <acronym>SQL</acronym>: An Overview</title> -->
  <title><acronym>SQL</acronym>の拡張――概略</title>
<indexterm><primary>SQL</primary><secondary sortas="かくちょう">拡張</secondary></indexterm>

  <para>
   <!-- In  the  sections  that follow, we will discuss how you
   can extend the <productname>Postgres</productname> 
   <acronym>SQL</acronym> query language by adding: -->

   あとに続くセクションでは、<productname>Postgres</productname>の<acronym>SQL</acronym>問い合わせ言語に、以下のようなもの追加することでどのように拡張できるかを説明します。
   </para>

   <itemizedlist spacing="compact" mark="bullet">
    <listitem>
     <para>
      <!-- functions -->
      関数
     </para>
    </listitem>
    <listitem>
     <para>
      <!-- types -->
      型
     </para>
    </listitem>
    <listitem>
     <para>
      <!-- operators -->
      オペレータ
     </para>
    </listitem>
    <listitem>
     <para>
      <!-- aggregates -->
      集約
     </para>
    </listitem>
   </itemizedlist>

  <sect1 id="extend-how">
   <!-- <title>How Extensibility Works</title> -->
   <title>拡張の作用法</title>

   <para>
   <!-- <productname>Postgres</productname> is extensible because its operation  is  
    catalog-driven.   If  you  are familiar with standard 
    relational systems, you know that  they  store  information
    about  databases,  tables,  columns,  etc., in what are
    commonly known as system catalogs.  (Some systems  call
    this  the data dictionary).  The catalogs appear to the
    user as tables like any other, but  the  <acronym>DBMS</acronym>  stores
    its  internal  bookkeeping in them.  One key difference
    between <productname>Postgres</productname> and  standard  relational  systems  is
    that <productname>Postgres</productname> stores much more information in its 
    catalogs __ not only information about tables and  columns,
    but also information about its types, functions, access
    methods, and so on.  These tables can be  modified  by
    the  user, and since <productname>Postgres</productname> bases its internal operation 
    on these tables, this means that <productname>Postgres</productname> can  be
    extended   by   users.    By  comparison,  conventional
    database systems can only be extended by changing hardcoded  
    procedures within the <acronym>DBMS</acronym> or by loading modules
    specially-written by the <acronym>DBMS</acronym> vendor.  -->

    <productname>Postgres</productname>の演算はカタログで駆動されているため拡張が可能です。もし標準のリレーショナルシステムに親しんでいるならば、システムカタログと呼ばれるものの中に、データベース、テーブル、カラムなどの情報が格納されていることを知っていることでしょう（システムによってはこれをデータ辞書と呼ぶものもあります）。このカタログは、ユーザーの目には他のテーブルと同じように見えますが、<acronym>DBMS</acronym>が内部情報をそこに格納しているのです。<productname>Postgres</productname>と標準のリレーショナルシステムの重要な違いは、<productname>Postgres</productname>はカタログにより多くの情報を格納するということです。テーブルとカラムに関する情報だけではなく、型、関数、アクセスメソッドなどの情報も格納されています。これらのテーブルはユーザーが変更できます。そして、<productname>Postgres</productname>は内部演算をこれらのテーブルに基づいて行うので、<productname>Postgres</productname>はユーザーによって拡張されることができるのです。対して一般のデータベースシステムでは、<acronym>DBMS</acronym>内のハードコーディングされたプロシージャを変えるか、<acronym>DBMS</acronym>によって特別に書かれたモジュールをロードしなければ拡張することができません。


   </para>

   <para>
    <!-- <productname>Postgres</productname> is also unlike most  other  data  managers  in
    that  the server can incorporate user-written code into
    itself through dynamic loading.  That is, the user  can
    specify  an  object code file (e.g., a compiled .o file
    or shared library) that implements a new type or  function 
    and <productname>Postgres</productname> will load it as required.  Code written 
    in <acronym>SQL</acronym> are even more trivial to add to the  server.
    This ability to modify its operation "on the fly" makes
    <productname>Postgres</productname> uniquely suited for rapid prototyping  of  new
    applications and storage structures. -->

    <productname>Postgres</productname>が他のデータマネージャと違うのは、サーバーが動的ローディングによってユーザーの書いたコードを取り入れられることです。つまり、ユーザーが新しい型か関数を実装するオブジェクトコードファイル（たとえばコンパイルされた.oファイルや共有ライブラリ）を指定することができ、<productname>Postgres</productname>は要求されたとおりにロードするのです。<acronym>SQL</acronym>で書かれたコードをサーバーに追加するのはさらに簡単です。このように演算を簡単に変えることができるため<productname>Postgres</productname>は新しいアプリケーションや格納構造体の迅速なプロトタイプに適しています。

   </para>
  </sect1>

  <sect1 id="type-system">
   <!-- <title>The <productname>Postgres</productname> Type System</title> -->
   <title><productname>Postgres</productname>の型システム</title>
<indexterm><primary>PostgreSQL</primary><secondary sortas="かた">型</secondary></indexterm>
   <para>
    <!-- The <productname>Postgres</productname> type system
    can be broken down in several ways.
    Types are divided into base types and composite  types.
    Base  types  are those, like <firstterm>int4</firstterm>, that are implemented
    in a language such as <productname>C</productname>.  They generally correspond  to
    what are often known as "abstract data types"; <productname>Postgres</productname>
    can only operate on such types through methods provided
    by  the  user and only understands the behavior of such
    types to the extent that the user describes them.  
    Composite  types  are  created whenever the user creates a
    table.  EMP is an example of a composite  type. -->

    <productname>Postgres</productname>の型システムはいくつかの方法で分解することができます。型は基本型と複合型に分かれます。基本型はたとえば<firstterm>int4</firstterm>のようなもので、<productname>C</productname>のような言語で書かれています。これらは一般的に「抽象データ型」として知られるものに対応しています。<productname>Postgres</productname>はユーザーに定義されるメソッドを通してのみ演算を行うことができ、ユーザーが定義する範囲しか理解しません。複合型はユーザーがテーブルを作ると作られます。EMPは複合型の一例です。

   
   </para>

   <para>
    <!-- <productname>Postgres</productname>  stores  these  types
    in only one way (within the
    file that stores all rows of a table)  but  the
    user can "look inside" at the attributes of these types
    from the query language and optimize their retrieval by
    (for example) defining indices on the attributes.
    <productname>Postgres</productname>  base  types are further
    divided into built-in
    types and user-defined  types.   Built-in  types  (like
    <firstterm>int4</firstterm>)  are  those  that  are  compiled
    into the system.
    User-defined types are those created by the user in the
    manner to be described below. -->

    <productname>Postgres</productname>はこれらの型を1つの方法でのみ格納しますが（テーブルのすべての行を格納しているファイルの中で）、ユーザーはこれらの型の属性の内部を問い合わせ言語で見ることができ、（たとえば）その属性のインデックスを定義することで抽出を最適化することができます。<productname>Postgres</productname>の基本型はさらに、組み込み型とユーザー定義型に分かれます。組み込み型（<firstterm>int4</firstterm>など）は、システムにコンパイルされているものです。ユーザー定義型は、以下に説明するような方法でユーザーが作ります。

   </para>
  </sect1>

  <sect1 id="pg-system-catalogs">
<!--   <title>About the <productname>Postgres</productname> System Catalogs</title> -->
   <title><productname>Postgres</productname>システムカタログについて</title>
<indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="しすてむかたろぐ">システムカタログ</secondary></indexterm>
   <para>
    <!-- Having  introduced the basic extensibility concepts, we
    can now take a look at how the  catalogs  are  actually
    laid  out.  You can skip this section for now, but some
    later sections will  be  incomprehensible  without  the
    information  given  here,  so  mark this page for later
    reference.
    All system catalogs have names  that  begin  with
    <firstterm>pg_</firstterm>.
    The  following  tables contain information that may be
    useful to the end user.  (There are many  other  system
    catalogs,  but there should rarely be a reason to query
    them directly.) -->

    基本的な拡張の概念を紹介しましたので、実際にカタログがどのように設計されているか見てみたいと思います。今はこのセクションを飛ばしても構いませんが、ここで与えられる情報なしで後のセクションを理解するのは難しくなるため、後の参照用にこのセクションはマークしておいてください。すべてのシステムカタログは<firstterm>pg_</firstterm>で始まる名前を持っています。次のテーブルはエンドユーザーに役立つかもしれない情報を持っています（ほかにもたくさんのシステムカタログがありますが、それらに直接問い合わせることはほとんどないはずです）。
   </para>

    <table tocentry="1">
     <!-- <title>Postgres System Catalogs</title> -->
     <title>Postgresシステムカタログ</title> 
     <titleabbrev>Catalogs</titleabbrev>
     <tgroup cols="2">
      <thead>
       <row>
	<!-- <entry>Catalog Name</entry> -->
        <entry>カタログ名</entry>
	<!-- <entry>Description</entry> -->
        <entry>説明</entry>
       </row>
      </thead>
      <tbody>
       <row>
	<entry>pg_database<indexterm><primary>pg_database</primary></indexterm><indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary>pg_database</secondary></indexterm></entry>
	<!-- <entry>databases</entry> -->
        <entry>データベース<indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary sortas="でーたべーす">データベース</secondary></indexterm></entry>
       </row>
       <row>
	<entry>pg_class<indexterm><primary>pg_class</primary></indexterm><indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary>pg_class</secondary></indexterm></entry>
	<!-- <entry>tables</entry> -->
	<entry>テーブル<indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary sortas="てーぶる">テーブル</secondary></indexterm></entry>
       </row>
       <row>
	<entry>pg_attribute<indexterm><primary>pg_attribute</primary></indexterm><indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary>pg_attribute</secondary></indexterm></entry>
	<!-- <entry>table columns</entry> -->
	<entry>テーブルカラム<indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary sortas="てーぶるからむ">テーブルカラム</secondary></indexterm></entry>
       </row>
       <row>
	<entry>pg_index<indexterm><primary>pg_index</primary></indexterm><indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary>pg_index</secondary></indexterm></entry>
	<!-- <entry>secondary indices</entry> -->
	<entry>副インデックス<indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary sortas="ふくいんでっくす">副インデックス</secondary></indexterm></entry>
       </row>
       <row>
	<entry>pg_proc<indexterm><primary>pg_proc</primary></indexterm><indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary>pg_proc</secondary></indexterm></entry>
	<!-- <entry>procedures (both C and SQL)</entry> -->
	<entry>プロシージャ（CとSQLの両方）<indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary sortas="ぷろしーじゃ">プロシージャ</secondary></indexterm></entry>
       </row>
       <row>
	<entry>pg_type<indexterm><primary>pg_type</primary></indexterm><indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary>pg_type</secondary></indexterm></entry>
	<!-- <entry>types (both base and complex)</entry> -->
	<entry>型（基本と複合の両方）<indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary sortas="かた">型</secondary></indexterm></entry>
       </row>
       <row>
	<entry>pg_operator<indexterm><primary>pg_operator</primary></indexterm><indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary>pg_operator</secondary></indexterm></entry>
	<!-- <entry>operators</entry> -->
	<entry>演算子<indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary sortas="えんざんし">演算子</secondary></indexterm></entry>
       </row>
       <row>
	<entry>pg_aggregate<indexterm><primary>pg_aggregate</primary></indexterm><indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary>pg_aggregate</secondary></indexterm></entry>
	<!-- <entry>aggregates and aggregate functions</entry> -->
	<entry>集約と集約関数<indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary sortas="しゅうやくとしゅうやくかんすう">集約と集約関数</secondary></indexterm></entry>
       </row>
       <row>
	<entry>pg_am<indexterm><primary>pg_am</primary></indexterm><indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary>pg_am</secondary></indexterm></entry>
	<!-- <entry>access methods</entry> -->
	<entry>アクセスメソッド<indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary sortas="あくせすめそっど">アクセスメソッド</secondary></indexterm></entry>
       </row>
       <row>
	<entry>pg_amop<indexterm><primary>pg_amop</primary></indexterm><indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary>pg_amop</secondary></indexterm></entry>
	<!-- <entry>access method operators</entry> -->
	<entry>アクセスメソッド演算子<indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary sortas="あくせすめそっどえんざんし">アクセスメソッド演算子</secondary></indexterm></entry>
       </row>
       <row>
	<entry>pg_amproc<indexterm><primary>pg_amproc</primary></indexterm><indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary>pg_amproc</secondary></indexterm></entry>
	<!-- <entry>access method support functions</entry> -->
	<entry>アクセスメソッドサポート関数<indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary sortas="あくせすめそっどさぽーとかんすう">アクセスメソッドサポート関数</secondary></indexterm></entry>
       </row>
       <row>
	<entry>pg_opclass<indexterm><primary>pg_opclass</primary></indexterm><indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary>pg_opclass</secondary></indexterm></entry>
	<!-- <entry>access method operator classes</entry> -->
	<entry>アクセスメソッド演算子クラス<indexterm><primary sortas="しすてむかたろぐ">システムカタログ</primary><secondary sortas="あくせすめそっどえんざんしくらす">アクセスメソッド演算子クラス</secondary></indexterm></entry>
       </row>
      </tbody>
     </tgroup>
    </table>

    <!-- The Reference Manual gives a more detailed  explanation
    of  these catalogs and their columns.  However,
    <xref linkend="EXTEND-CATALOGS">
    shows the major entities and their  relationships
    in  the system catalogs.  (Columns that do not refer
    to other entities are not shown unless they are part of
    a primary key.)
    This diagram is more or less incomprehensible until you
    actually start looking at the contents of the  catalogs
    and  see  how  they relate to each other.  For now, the
    main things to take away from this diagram are as  follows: -->

   <para>
    リファレンスマニュアルにはこれらのカタログとそのカラムの詳しい説明がありますが、<xref linkend="EXTEND-CATALOGS">がシステムカタログの主要な実体とそれらの関係を表しています（他の実体を参照しない実体は主キーの一部でない限り表されていません）。この表は、実際にカタログの中身を見てそれらがお互いどう関係しているかを見るまでは理解しづらいものです。今は、この表で以下の項目を理解してください
</para>

    <figure float="1" id="EXTEND-CATALOGS">
     <!-- <title>The major <productname>Postgres</productname> system catalogs</title> -->
     <title>主要な<productname>Postgres</productname>システムカタログ</title>
     <graphic fileref="catalogs.gif" format="GIF" align="center"></graphic>
    </figure>

    <itemizedlist spacing="compact" mark="bullet">
     <listitem>
      <para>
       <!-- In  several of the sections that follow, we will
       present various join queries on the system 
       catalogs  that display information we need to extend
       the system.  Looking at this diagram should make
       some  of  these  join  queries  (which are often
       three- or four-way joins)  more  understandable,
       because  you  will  be  able  to  see  that  the
       columns used in the queries form foreign keys
       in other tables. -->

       あとに続くいくつかのセクションでは、システムを拡張するのに必要な情報を示すシステムカタログのさまざまな結合問い合わせを紹介します。この表を見ることでこれらの結合問い合わせ（しばしば三重あるいは四重の結合です）は理解しやすくなるでしょう。なぜなら問い合わせで使われるカラムは他のテーブルの外部キーになることがわかるからです。

      </para>
     </listitem>
     <listitem>
      <para>
       <!-- Many  different  features  (tables, columns,
       functions,  types,  access  methods,  etc.)  are
       tightly  integrated  in  this  schema.  A simple
       create command may modify many  of  these  catalogs. -->

       多くの機能（テーブル、カラム、関数、型、アクセスメソッドなど）はこの概要にぎっしりと統合されています。単純なcreateコマンドでこれらのカタログの多くを変更してしまうかもしれません。

      </para>
     </listitem>
     <listitem>
      <para>
       <!-- Types and procedures
       are central to the schema. -->

       型とプロシージャはこの概要の中心です。
   </para>

       <note>
	<para>
	<!-- We  use  the words <firstterm>procedure</firstterm>
	 and <firstterm>function</firstterm> more or less interchangably. -->

         ここでは<firstterm>プロシージャ</firstterm>と<firstterm>function</firstterm>はほぼ同じ意味で使われています。

	</para>
       </note>

   <para>
       <!-- Nearly  every catalog contains some reference to
       rows in one or both of these tables.   For
       example,  <productname>Postgres</productname>  frequently  uses type 
       signatures (e.g.,  of  functions  and  operators)  to
       identify unique rows of other catalogs. -->

       ほぼすべてのカタログがこれらのテーブルの1つか両方の中の行を参照しています。たとえば、<productname>Postgres</productname>は他のカタログの一意な行を識別するために頻繁に型記号（たとえば関数や演算子のもの）を使います。

      </para>
     </listitem>
     <listitem>
      <para>
       <!-- There are many columns and relationships that
       have obvious meanings, but there are many  
       (particularly  those  that  have  to  do with access
       methods) that do not.  The relationships between
       pg_am,   pg_amop,   pg_amproc,  pg_operator  and
       pg_opclass are particularly hard  to  understand
       and  will  be described in depth (in the section
       on interfacing types and operators  to  indices)
       after we have discussed basic extensions. -->

       明白な意味を持つカラムや関係はありますが、そうではないもの（特にアクセスメソッドと関係するもの）もたくさんあります。pg_am、pg_amop、pg_amproc、pg_operator、pg_opclassの関係は特に理解しづらいので、基本的な拡張について説明した後で（インデックスの型と演算子を連結させるセクションで）詳しく説明します。
      </para>
     </listitem>
    </itemizedlist>
  </sect1>
 </chapter>

<!-- Keep this comment at the end of the file
Local variables:
mode:sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"./reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:("/usr/lib/sgml/catalog")
sgml-local-ecat-files:nil
End:
-->
