[
https://issues.apache.org/jira/browse/ARIA-180?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Avia Efrat reassigned ARIA-180:
-------------------------------
Assignee: Avia Efrat
> Convert many-to-many for parameter models to one-to-many
> --------------------------------------------------------
>
> Key: ARIA-180
> URL: https://issues.apache.org/jira/browse/ARIA-180
> Project: AriaTosca
> Issue Type: Task
> Reporter: Tal Liron
> Assignee: Avia Efrat
> Priority: Minor
>
> We must first discuss this as a team to see if we agree that this is the best
> solution. (There was an early discussion between Tal and Maxim.)
> First let's point out that one-to-many is a special case of many-to-many, so
> that everything works fine now and continue to work fine.
> However, logically our code right now treats them as one-to-many: there is no
> case in which a {{Parameter}} model belongs to more than one model.
> Parameters are always copied to the new model, for example during
> instantiation, or during task creation.
> There are cons to using many-to-many in our case:
> * We generate lots of extra secondary tables, one for each potential
> relationship
> * Crawling back from a {{Parameter}} to its containing model is quite costly,
> as it involves a new SQL query to check for each possible relationship
> * Logical confusion: if we do not write our code to support one parameter
> belonging to one model, and yet a user can create such a relationship, what
> would happen?
> * Slower
> The one advantage of many-to-many is that we *could* potentially optimize in
> some cases where the parameter has an identical value and we know would never
> change, and thus could safely link it multiple times instead of copying it.
> This optimization, however, requires us to be 100% sure that the parameter is
> immutable: otherwise, if a user changes it (for example in a task) it would
> change for all other containers. The questions are: 1) are we ever sure of
> immutability? and 2) is this optimization worth the effort of implementing
> it? The optimization would only seem to save some disk space.
> Another advantage is that it's much easier to add new models that use
> {{Parameter}} by adding an extra table (many-to-many) rather than adding fk
> columns to an existing table. To that there is a simple answer: new models
> can definitely create many-to-many relationships to anything else. Using
> one-to-many for our own models doesn't preclude that. (And we can even add
> code that automatically tries to look through such many-to-many relationships
> in order to find a container.)
> If we decide to switch to one-to-many, we have two approached:
> * Straightforward: one foreign key in {{Parameter}} per each possible
> containing relationship. Pros: naturally supported in SQL, cons: we will have
> lots of fk columns per row in the {{Parameter}} table, whereby only one will
> be non-null.
> * Polymorphic one-to-many (type-and-id joins): {{Parameter}} only has a
> single general-purpose fk column and another column specifying the type of
> the fk (node, interface, task, etc.). Cons: we would need to investigate how
> to accomplish this in SQLAlchemy.
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)