Hello,

Please forgive me for asking such a stupid and rough question.

I'm thinking of making PostgreSQL a multi-model database by supporting
data models other than the current relational model.  A data model
consists of a query language (e.g. SQL for relational model, Cypher
for graph model), a parser and analyzer to transform a query into a
query tree, a planner to transform the query tree into an execution
plan, an executor, and a storage engine.

To promote the data model development, I want to make data models
pluggable.  The rough sketch is:

1) A data model developer implements the parser, analyzer,
transformer, planner, executor, and storage engine functions in a
shared library.

2) The DBA registers the data model.

  CREATE QUERY LANGUAGE Cypher (
    PARSER = <parser function>
  );

  CREATE DATA MODEL graph (
    QUERY LANGUAGE = Cypher,
    ANALYZER = <analyzer function>,
    TRANSFORMER = <transformer function>,
    PLANNER = <planner function>,
    EXECUTOR = <executor function>,
    STORAGE ENGINE = <storage engine function>,
  );

  CREATE REGION cypher_graph (
    QUERY LANGUAGE = Cypher,
    DATA MODEL = graph
  );

The region is just a combination of a query language and a data model,
much like a locale is a combination of a language and a country.  This
is because there may be multiple popular query languages for a data
model.

3) The application connects to the database, specifying a desired
region.  The specified region's query language becomes the default
query language for the session.


The application can use the data of multiple data models in one query
by specifying another region and its query via in_region().  For
example, the following query combines the relational restaurant table
and a social graph to get the five chinese restaurants in Tokyo that
are most popular among friends of John and their friends.

  SELECT r.name, g.num_likers
  FROM restaurant r,
    cast_region(
      in_region('cypher_graph',
        'MATCH (:Person {name:"John"})-[:IS_FRIEND_OF*1..2]-(friend),
          (friend)-[:LIKES]->(restaurant:Restaurant)
          RETURN restaurant.name, count(*)'),
    'relational', 'g', '(name text, num_likers int')
  WHERE r.name = g.name AND
    r.city = 'Tokyo' AND r.cuisine = 'chinese'
  ORDER BY g.num_likers DESC LIMIT 5;


What do you think would be difficult to make data models pluggable,
especially related to plugging the parser, planner, executor, etc?
One possible concern is that various PostgreSQL components might be
too dependent on the data model being relational, and it would be
difficult to separate tight coupling.

Regards
MauMau



-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to