[Dbix-class] Database: Slave or Master - call for paper review

Darren Duncan darren at DarrenDuncan.net
Thu Sep 28 10:45:27 CEST 2006


At 6:12 PM +1200 9/28/06, Sam Vilain wrote:
>Hi all,
>
>I've recently written a paper for OSDC.com.au, and I was wondering if
>anyone here would like to provide comments about it.  Amongst other
>things it lays some groundwork for sensible translation of DDL to the
>Perl 6 metamodel and back.

I assume you refer to the conference happening mid-December of this year?

In any event, this whole topic is closely related to what I am doing, 
which includes eliminating any object/relational impledence mismatch 
at the level of the fundamentals.  I will give you what feedback I 
can.

>The Perl 6 fragments I'm hoping to get reviewed on the perl6-language
>list, but the rest of it is for general review.
>
>There is a PDF at http://utsl.gen.nz/talks/dbic-tangram.pdf, and if
>anyone wants to look at the source, that's at
>git://utsl.gen.nz/dbic-tangram-paper

Note that I noticed at least one grammatical error in the PDF, but I 
will not mention those here since you'll probably catch them yourself 
on another read-through.  Also, I won't comment on the Perl 6 code 
examples that you also posted to perl6-language, since p6l is doing 
that.

1.  The paper in general looks very well done, and I wouldn't 
recommend any major changes to it.  You raise a lot of good points 
and ideas that afaik are not part of the status quo, and so 
implementing what you suggest will certainly improve our lot.  Well 
done!

2.  Some of your Perl syntax is out of date already.  Perl 6 no 
longer has a .id, but rather a .WHICH, afaik.

3.  While you can use SQL or its terminology for illustrative 
examples, you should never word your proposal as if it is 
SQL-specific; that would be limiting yourself too much.  There are 
many useful database implementations that don't use SQL as their 
query language, ane even within those that do use SQL, each one uses 
it differently, so its not like 1 language.

Towards that end, here are some suggested rewordings.

Replace:

   Abstract

   finally expressions are related to SQL fragments and iterations 
over expressions related to SQL queries.

With:

   Abstract

   finally Perl expressions are related to definitions of database 
queries and iterations over expressions related to executions of 
those queries.

Replace:

   1. Introduction

   This schism is what we are trying to eliminate, by mapping the 
entire Perl metamodel to some representation of the SQL Data 
Definition Language (DDL), and the entire variety of the DDL to 
corresponding Perl 6 metamodel components.

With:

   1. Introduction

   This schism is what we are trying to eliminate, by mapping the 
entire Perl metamodel to some representation of a Data Definition 
Language (DDL), and the entire variety of the DDL to corresponding 
Perl 6 metamodel components.

4.  Regarding this section:

   2.1 Object Identity as Primary Key

   One could say that instead of using a surrogate row ID, you could 
use the entire object as the 'primary key' - this would certainly sit 
better with Set Theory, and get rid of that 'duplicate row problem' 
that drives the theorists crazy.

   However, much as requiring all tables without primary keys to have 
a big primary key for the entire row would be insane, defining .id so 
that it would include all the properties of the object has side 
effects.

I would say that there is nothing insane about a primary key being 
over all of the columns in a table, if there is no subset of those 
columns that can by themselves uniquely identify an object.

The primary key / object id should correspond to the simplest or 
smallest collection of its attributes that are guaranteed to be 
unique per object, but it may be that with some objects, all of the 
attributes must be included.

But that says more about the object class definition itself than the database.

In any event, if we actually want to store the same object definition 
more than once in a database, because the quantity of such identical 
definitions carries some useful information, then the better approach 
is to just store it once and add an extra database column to store a 
quantity number.  Considering this simple alternative, there is never 
any valid reason to store actual duplicate rows in a database, so set 
theorists and everyone else both can be happy.

(I would also say that there is no reason to have a "primary" key at 
all, since any uniquely identifying set of columns is as good as any 
other, so we simply have one or more "key", and either can be used to 
reference the record.  Though if setting a key aside as "primary" 
makes something easier to do, it isn't bad.)

5.  Regarding this section:

   2.2  Attributes as Columns

   Any attributes that do not have a [corresponding native database] 
type defined are fair game for storing using a proprietary storage 
mechanism, similar to that employed by Tangram::Type::Dump::Any. Such 
a schema can not be called 'normalised' and will not be stable.

Please defend that last statement, or rewrite it to clarify what you 
mean, since I interpret it by itself to be flat-out wrong.

I say that it is perfectly valid for a data type to be arbitrarily 
complicated, and this does in no way violate any relational database 
normalization principles.  For example, it is valid for a data type 
to be not only a number or a string, but it could be a date or a 
geometric shape or a picture or an XML document or whatever.  Any of 
these could conceptually be stored in a single field of a table row, 
either actually in a serialized or database supported form, or in 
another related table.

Regarding stability, the only way something like this can destabilize 
is if the proprietary storage mechanism changes how it works between 
when the database started being used and how it is currently used, 
without running a conversion op on the database.  But then you could 
run into the same problem if you change which database wrapper module 
you use.

6.  Regarding this section:

   4 Query Expressions

   Query expressions are a difficult issue. Nobody seems to want to 
write SQL for everything, but people still want the full power of SQL 
available to them. Why is it that most database abstractions leave 
wide gaping sections of SQL unable to be generated without cumbersome 
manual SQL fragments?

If things go according to my plan, there will be released in a few 
weeks (prior to the end of October) a working Perl 5 module that 
entirely lacks this problem, "QDRDBMS".  So if that actually comes to 
pass, feel free to update the above statement to say that it 
describes the general case, but that my module is an exception.  But 
regardless, I agree with the statement in the general case.

That's all the feedback for this round.

Keep up the good work!

-- Darren Duncan



More information about the Dbix-class mailing list