extend.sgml
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:9k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. <Chapter Id="extend">
  2. <Title>Extending <Acronym>SQL</Acronym>: An Overview</Title>
  3. <Para>
  4.      In  the  sections  that follow, we will discuss how you
  5.      can extend the <ProductName>Postgres</ProductName> <Acronym>SQL</Acronym> query language by adding:
  6. <ItemizedList Mark="bullet" Spacing="compact">
  7. <ListItem>
  8. <Para>
  9.       functions
  10. </Para>
  11. </ListItem>
  12. <ListItem>
  13. <Para>
  14.       types
  15. </Para>
  16. </ListItem>
  17. <ListItem>
  18. <Para>
  19.       operators
  20. </Para>
  21. </ListItem>
  22. <ListItem>
  23. <Para>
  24.       aggregates
  25. </Para>
  26. </ListItem>
  27. </ItemizedList>
  28. </Para>
  29. <Sect1>
  30. <Title>How Extensibility Works</Title>
  31. <Para>
  32.      <ProductName>Postgres</ProductName> is extensible because its operation  is  
  33.      catalog-driven.   If  you  are familiar with standard 
  34.      relational systems, you know that  they  store  information
  35.      about  databases,  tables,  columns,  etc., in what are
  36.      commonly known as system catalogs.  (Some systems  call
  37.      this  the data dictionary).  The catalogs appear to the
  38.      user as classes, like any other, but  the  <Acronym>DBMS</Acronym>  stores
  39.      its  internal  bookkeeping in them.  One key difference
  40.      between <ProductName>Postgres</ProductName> and  standard  relational  systems  is
  41.      that <ProductName>Postgres</ProductName> stores much more information in its 
  42.      catalogs -- not only information about tables and  columns,
  43.      but also information about its types, functions, access
  44.      methods, and so on.  These classes can be  modified  by
  45.      the  user, and since <ProductName>Postgres</ProductName> bases its internal operation 
  46.      on these classes, this means that <ProductName>Postgres</ProductName> can  be
  47.      extended   by   users.    By  comparison,  conventional
  48.      database systems can only be extended by changing hardcoded  
  49.      procedures within the <Acronym>DBMS</Acronym> or by loading modules
  50.      specially-written by the <Acronym>DBMS</Acronym> vendor.
  51. </Para>
  52. <Para>
  53.      <ProductName>Postgres</ProductName> is also unlike most  other  data  managers  in
  54.      that  the server can incorporate user-written code into
  55.      itself through dynamic loading.  That is, the user  can
  56.      specify  an  object code file (e.g., a compiled .o file
  57.      or shared library) that implements a new type or  function 
  58.      and <ProductName>Postgres</ProductName> will load it as required.  Code written 
  59.      in <Acronym>SQL</Acronym> are even more trivial to add to the  server.
  60.      This ability to modify its operation "on the fly" makes
  61.      <ProductName>Postgres</ProductName> uniquely suited for rapid prototyping  of  new
  62.      applications and storage structures.
  63. </Para>
  64. </Sect1>
  65. <Sect1>
  66. <Title>The <ProductName>Postgres</ProductName> Type System</Title>
  67. <Para>
  68.      The  <ProductName>Postgres</ProductName> type system can be broken down in several ways.
  69.      Types are divided into base types and composite  types.
  70.      Base  types  are those, like <FirstTerm>int4</FirstTerm>, that are implemented
  71.      in a language such as <ProductName>C</ProductName>.  They generally correspond  to
  72.      what are often known as "abstract data types"; <ProductName>Postgres</ProductName>
  73.      can only operate on such types through methods provided
  74.      by  the  user and only understands the behavior of such
  75.      types to the extent that the user describes them.  
  76.      Composite  types  are  created whenever the user creates a
  77.      class.  EMP is an example of a composite  type.   
  78. </Para>
  79. <Para>
  80.      <ProductName>Postgres</ProductName>  stores  these  types  in only one way (within the
  81.      file that stores all instances of the  class)  but  the
  82.      user can "look inside" at the attributes of these types
  83.      from the query language and optimize their retrieval by
  84.      (for example) defining indices on the attributes.
  85.      <ProductName>Postgres</ProductName>  base  types are further divided into built-in
  86.      types and user-defined  types.   Built-in  types  (like
  87.      <FirstTerm>int4</FirstTerm>)  are  those  that  are  compiled into the system.
  88.      User-defined types are those created by the user in the
  89.      manner to be described below.
  90. </Para>
  91. </Sect1>
  92. <Sect1>
  93. <Title>About the <ProductName>Postgres</ProductName> System Catalogs</Title>
  94. <Para>
  95.      Having  introduced the basic extensibility concepts, we
  96.      can now take a look at how the  catalogs  are  actually
  97.      laid  out.  You can skip this section for now, but some
  98.      later sections will  be  incomprehensible  without  the
  99.      information  given  here,  so  mark this page for later
  100.      reference.
  101.      All system catalogs have names  that  begin  with  <FirstTerm>pg_</FirstTerm>.
  102.      The  following  classes contain information that may be
  103.      useful to the end user.  (There are many  other  system
  104.      catalogs,  but there should rarely be a reason to query
  105.      them directly.)
  106. <TABLE TOCENTRY="1">
  107. <TITLE>Postgres System Catalogs</TITLE>
  108. <TITLEABBREV>Catalogs</TITLEABBREV>
  109. <TGROUP COLS="2">
  110. <THEAD>
  111. <ROW>
  112. <ENTRY>Catalog Name</ENTRY>
  113. <ENTRY>Description</ENTRY>
  114. </ROW>
  115. </THEAD>
  116. <TBODY>
  117. <ROW>
  118. <ENTRY>pg_database</ENTRY>
  119. <ENTRY> databases</ENTRY>
  120. </ROW>
  121. <ROW>
  122. <ENTRY>pg_class</ENTRY>
  123. <ENTRY> classes</ENTRY>
  124. </ROW>
  125. <ROW>
  126. <ENTRY>pg_attribute</ENTRY>
  127. <ENTRY> class attributes</ENTRY>
  128. </ROW>
  129. <ROW>
  130. <ENTRY>pg_index</ENTRY>
  131. <ENTRY> secondary indices</ENTRY>
  132. </ROW>
  133. <ROW>
  134. <ENTRY>pg_proc</ENTRY>
  135. <ENTRY> procedures (both C and SQL)</ENTRY>
  136. </ROW>
  137. <ROW>
  138. <ENTRY>pg_type</ENTRY>
  139. <ENTRY> types (both base and complex)</ENTRY>
  140. </ROW>
  141. <ROW>
  142. <ENTRY>pg_operator</ENTRY>
  143. <ENTRY> operators</ENTRY>
  144. </ROW>
  145. <ROW>
  146. <ENTRY>pg_aggregate</ENTRY>
  147. <ENTRY> aggregates and aggregate functions</ENTRY>
  148. </ROW>
  149. <ROW>
  150. <ENTRY>pg_am</ENTRY>
  151. <ENTRY> access methods</ENTRY>
  152. </ROW>
  153. <ROW>
  154. <ENTRY>pg_amop</ENTRY>
  155. <ENTRY> access method operators</ENTRY>
  156. </ROW>
  157. <ROW>
  158. <ENTRY>pg_amproc</ENTRY>
  159. <ENTRY> access method support functions</ENTRY>
  160. </ROW>
  161. <ROW>
  162. <ENTRY>pg_opclass</ENTRY>
  163. <ENTRY> access method operator classes</ENTRY>
  164. </ROW>
  165. </TBODY>
  166. </TGROUP>
  167. </TABLE>
  168. </Para>
  169. <Para>
  170. <Figure Id="EXTEND-CATALOGS" Float="1">
  171. <Title>The major <ProductName>Postgres</ProductName> system catalogs</Title>
  172. <Graphic Align="center" FileRef="catalogs.gif" Format="GIF"></Graphic>
  173. </Figure>
  174.      The Reference Manual gives a more detailed  explanation
  175.      of  these catalogs and their attributes.  However,
  176. <XRef LinkEnd="EXTEND-CATALOGS" EndTerm="EXTEND-CATALOGS">
  177.      shows the major entities and their  relationships
  178.      in  the system catalogs.  (Attributes that do not refer
  179.      to other entities are not shown unless they are part of
  180.      a primary key.)
  181.      This diagram is more or less incomprehensible until you
  182.      actually start looking at the contents of the  catalogs
  183.      and  see  how  they relate to each other.  For now, the
  184.      main things to take away from this diagram are as  follows:
  185.      
  186. <ItemizedList Mark="bullet" Spacing="compact">
  187. <ListItem>
  188. <Para>
  189.       In  several of the sections that follow, we will
  190.             present various join queries on the system 
  191.             catalogs  that display information we need to extend
  192.             the system.  Looking at this diagram should make
  193.             some  of  these  join  queries  (which are often
  194.             three- or four-way joins)  more  understandable,
  195.             because  you  will  be  able  to  see  that  the
  196.             attributes used in the queries form foreign keys
  197.             in other classes.
  198. </Para>
  199. </ListItem>
  200. <ListItem>
  201. <Para>  Many  different  features  (classes, attributes,
  202.             functions,  types,  access  methods,  etc.)  are
  203.             tightly  integrated  in  this  schema.  A simple
  204.             create command may modify many  of  these  catalogs.
  205. </Para>
  206. </ListItem>
  207. <ListItem>
  208. <Para>  Types and procedures
  209.             are central to the schema.
  210. <Note>
  211. <Para>
  212. We  use  the words <FirstTerm>procedure</FirstTerm> and <FirstTerm>function</FirstTerm> more or less
  213. interchangably.
  214. </Para>
  215. </Note>
  216.             Nearly  every catalog contains some reference to
  217.             instances in one or both of these classes.   For
  218.             example,  <ProductName>Postgres</ProductName>  frequently  uses type 
  219.             signatures (e.g.,  of  functions  and  operators)  to
  220.             identify unique instances of other catalogs.
  221. </Para>
  222. </ListItem>
  223. <ListItem>
  224. <Para>  There are many attributes and relationships that
  225.             have obvious meanings, but there are many  
  226.             (particularly  those  that  have  to  do with access
  227.             methods) that do not.  The relationships between
  228.             pg_am,   pg_amop,   pg_amproc,  pg_operator  and
  229.             pg_opclass are particularly hard  to  understand
  230.             and  will  be described in depth (in the section
  231.             on interfacing types and operators  to  indices)
  232.             after we have discussed basic extensions.
  233. </para>
  234. </ListItem>
  235. </ItemizedList>
  236. </Para>
  237. </sect1>
  238. </Chapter>