There would be no reason to have to go through the Entity Engine just because 
of something like this, that's somewhat silly... sorry.

Regardless of the data model you have to be aware of the model in order to 
effectively get anything out of any database.

In this circumstance it is not anything new. Various fields required for the CreditCard, 
EftAccount, etc require the fields on the PaymentMethod entity. The same is true for 
Party. The same is true for ContactMech. The same is true for any set of entities in 
OFBiz that all share the same primary key, one of which entities will "own" 
that primary key.

That would make it non-normalized? Well of course! Why on earth would we want 
anything normalized in a modern system like OFBiz? The only reason for 
normalization in a data model traditionally is for performance, but at the 
often severe price of limiting flexibility, or perhaps more precisely: 
destroying flexibility.

This is one of many causes of out of control costs of enterprise systems that 
is simply not needed for modern hardware and database software.

Even 20 years ago it was a stupid idea. That's all there is to it. Anyone with 
any experience with optimization knows that you write for flexibility and 
simplicity, then test to find the performance bottlenecks and then you fix 
those bottlenecks only introducing complexity and limiting flexibility where 
_absolutely_ necessary (ie where no creativity can be applied to avoid it).

Perhaps saying it was a stupid idea is too harsh, and somewhat wrong. The 
normalization patterns are masterfully effective for optimization, but when 
applied preemptively instead of for optimization following the pattern 
described above. It was somewhat the case that for older hardware preemptively 
optimizing was necessary because if you waited it wouldn't change anything, 
you'd have to do those optimizations anyway.

These days, that simply isn't true. If it were true a package like OFBiz would 
be impossible because the implementation would have to be so specific to a 
certain set of requirements that it would be useless for other organizations, 
and even more so for other industries.

You can disagree with me all day if you want. I've been through this dozens of 
times with dozens of people who have experience with this older style of system 
or database. This is one of the more important keys to the success of OFBiz, 
and without it the project would simply not be what it is today, if it were at 
all...

-David


Chris Howe wrote:
Because it's an inconsistant dependency which makes it
nonnormalized.  Sure that's database design theory and
rules can be broken if there's enough benefit.

But consider the real world dificulties that arise
when you have incosistant dependency. If you're entire
application world is OFBiz, there is no problem.  But,
if you have an outside application pulling information
from the OFBiz database, it now has to go through
OFBiz's entity engine to get it or it has to be aware
that some of the credit card information is in the
PaymentMethod entity.  This is unnecessary if you keep
the data model normalized whenever possible.  It is
certainly possible in this instance.


--- "David E. Jones" <[EMAIL PROTECTED]> wrote:

If each type of PaymentMethod might have a
description on it (ie CreditCard, EftAccount, etc),
then why not put if on the PaymentMethod entity? In
fact, I think it's somewhat silly not to...

-David


Chris Howe wrote:
Re first comment:

If a paymentMethod requires no additional entity
what
is the name doing for you that the type isn't?

Re second comment (but there is no description
on...):
I'm saying that there should be a
CreditCard.description, et al but not a
PaymentMethod.description.

Re third comment (if i have to .getRelated it's a
mess):

And if i'm only working with credit cards, I have
to
.getRelated back to the PaymentMethod.  Isn't that
the
same mess?  There's no benefit except for this
specific application.  You're sacrificing
normalization in the data model for coding ease
that
doesn't run both ways.

Placing the description in the PaymentMethod for
what
you're wanting to accomplish creates an
inconsistant
dependency.


--- Si Chen <[EMAIL PROTECTED]>
wrote:
On Jun 28, 2006, at 4:21 PM, Chris Howe wrote:

Let me explain it differently.  The
PaymentMethod
entity is an entity of convenience, not an
entity
that
describes anything.
No, it's an entity that describes a payment
method.
There are some payment methods which have additional information specific to them, but then again there may be some other payment methods which don't require additional entities.
So now we add description.  But, there's already
a
description (firstName, lastName) for Person and
a
description (groupName) for Corporation.  This
is
information that is likely to change and we will
need
to keep track of it in multiple locations when
it
is
unneccesary.

But there is no description on CreditCard,
EftAccount, nor is there an equivalent field. So this is not the case
right?
So, there's no benefit of adding the
description,
but
you've added the possibility of the
nonnormalized
data
to be inconsistant.  Does that make a good data
model?

Actually there's a real benefit.  If I just want
to
get the description of a PaymentMethod and it's on the PaymentMethod, it's very easy. If I have to .getRelated based on the type of the PaymentMethod to another entity, it's a mess.


--- David E Jones <[EMAIL PROTECTED]> wrote:

Huh?

Chris Howe wrote:
It may apply to all payment methods (I'm not
really
sure that it applies to all current payment
methods,
much less ALL that may exist), but it does not
describe the payment method.  It describes the
payment
method's child so it should go in the entity
that
it
is describing.

Following through with the approach of putting
the
field in PaymentMethod entity puts you in the
position
of modifying the data to fit the data model
instead of
keeping the data model flexible enough to fit
the
data.

--- Si Chen <[EMAIL PROTECTED]>
wrote:
I disagree.  This is a descriptive note that
applies
to all
PaymentMethods so why put it in the child
entities.
If you had a
parent class which had a field that all
inherited
classes should
have, shouldn't be in the parent class?



On Jun 28, 2006, at 1:35 PM, Chris Howe
wrote:
"Bank A general account" does not describe
the
PaymentMethod, it describes the credit card,
the
company account, the gift card, etc so that
field
should go on the CreditCard, etc entity.
Now
if
you're using it as an alias for the Payment
Method,
then you should create a
PaymentMethodAttribute
entity
and make a relationship between the two.


On a side note.  I've noticed a couple of
fields
getting added onto entities in svn that are
quick
fixes to gain functionality but cause a loss
of
the
entity's meaning.  PaymentMethod.partyId is
one
that
quickly comes to mind.

--- Si Chen
<[EMAIL PROTECTED]>
wrote:
Hi everybody.

What do you think of adding a field
"paymentMethodName" to
PaymentMethod, so a company can identify
that
method
A is "Bank A
general account", etc. etc.

Si


Reply via email to