* Cédric Krier: " Re: [tryton-dev] Database schema name limit" (Sat, 23 May
  2015 12:18:32 +0200):

> On 23 May 11:01, Mathias Behrle wrote:
> > * Cédric Krier: " [tryton-dev] Database schema name limit" (Thu, 21 May 2015
> >   17:52:57 +0200):
> > 
> > > Hi,
> > > 
> > > I'm facing a limitation with how trytond generate the table name for a
> > > ModelSQL. Databases have different length limitation for schema name.
> > > For example,
> > > PostgreSQL has the limit to 64 when Oracle has the limit to 30
> > > (yes I'm working on an Oracle backend).
> > > 
> > > I don't want that we change our naming convention because it is quite
> > > good and reducing the name will just bring a lot in readability.
> > > And we will be forced to use the least common constraint.
> > > 
> > > So my idea is to have a configuration section which will provide the
> > > table name to use for a Model.
> > > 
> > > Example:
> > > 
> > > [table]
> > > account.invoice.payment_term.line.relativedelta = acc_inv_pt_l_reldelta
> > > account.payment.sepa.message = acc_payment_sepa_msg
> > > 
> > > Of course such configuration could not be modified once a database has
> > > been created (or the table should be renamed).
> > > 
> > > Side effect, it could also be used to fix naming conflict between 2
> > > unrelated module (at the database level not Model.__name__).
> > > 
> > > What do you think?
> > 
> > The backside of this translation table is, that you have to know beforehand
> > all tables in your database, before you install them and that it has to be
> > done manually.
> 
> Yes but any way, any *real* production installation will require to
> customize the database schema. I always thought that Tryton will never
> generate the perfect schema but only a minimal working schema.
> 
> > What about a configuration option 'oracle_compatibility = True', that will
> > slug the ususal names in a reproducible way?
> 
> The problem is not oracle. The problem is the limitation that all
> databases have.
> But if you have a better solution, I will be graceful to evaluate.
> For example, a good algorithm to generate size compatible from Model
> name.

As we seem to have a maximal length of 64, I would propose to just truncate
table names, that hit that limit and to number them for avoidance of
collisions, e.g.:
table_name_longer_than_sixtyfour_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
would transform to 
table_name_longer_than_sixtyfour_xxxxxxxxxxxxxxxxxxxxxxxxxx_001

If that maximal table name length cannot be determined automatically
(with python-sql or by some other means) this could be
the configuration parameter 'table_name_max_length'.

Additionally we could introduce the configuration option
'table_element_length'

The expected results would be
e.g. with 
table_element_length = 3
table_name_max_length = 32

account.invoice.payment_term.line.relativedelta => acc_inv_pay_ter_lin_rel
account.payment.sepa.message => acc_pay_sep_mes

table.name.longer.than.sixtyfour.xxxxxxxxxxxxxxxx.yyyyy =>
tab_nam_lon_tha_six_xxx_yyy

table.name.longer.than.sixtyfour.xxxxxxxxxxxxxxxx.yyyyyy.zzzzz =>
tab_nam_lon_tha_six_xxx_yyy_001

The shorter the elements will be, the less a table name of course will be
readable for its underlying model. But an algorithm like this seems to a good
compromise for me.


-- 

    Mathias Behrle
    MBSolutions
    Gilgenmatten 10 A
    D-79114 Freiburg

    Tel: +49(761)471023
    Fax: +49(761)4770816
    http://www.m9s.biz
    UStIdNr: DE 142009020
    PGP/GnuPG key availabable from any keyserver, ID: 0x8405BBF6

Attachment: pgpgQmEkq2TVD.pgp
Description: Digitale Signatur von OpenPGP

Reply via email to