[TYPO3-mvc] [!!!] FYI: Implemented first version of single table inheritance.

Jochen Rau jochen.rau at typoplanet.de
Thu Apr 15 22:37:06 CEST 2010


Hi.

Single table inheritance is a beast ;-) That said, I can describe the 
current state I have committed with r2226.

[!!!] But before we start, note that there is a breaking change. Until 
this rev. Extbase made a "best guess" for the table name if it was not 
the lowercased class name (simply by crawling the class hierarchy 
upwards trying to find a mapping rule or table). I have removed this 
"magic" because It was very hard to understand what was happening; esp. 
if there was an error.

Now, let's have a class hierarchy like

                 Party
                 |   |
       Organization   Person
	|    |
    Company ScientificInstitution

The class Party is a class of another extension. All the other classes 
are part of my extension. The classes Party and Organization will never 
get instanciated but their concrete classes Person, Company and 
ScientificInstitution.

There are different ways to map this class hierarchy onto the Relational 
Model of a database:

1) Map the entire class hierarchy to a single table.
     aka "Single Table Inheritance"
2) Map each concrete class to its own table.
     aka "Class Table Inheritance"
3) Map each class to its own table.
     aka "Concrete Table Inheritance"
4) Map the classes into a generic structure.

Examples:
1) Single Table Inheritance: All the data of the concrete classes 
(Company, ScientificInstitution and Person) are stored in the single 
table "party". This table has an extra field (could be any name) 
indicating the record type (the class name by default). The name of the 
extra field must be defined in the "ctrl" section of the TCA of the 
table (key: "type").

If you query for Company objects through a CompanyRepository, you only 
find objects of this particular type. But you can also have an 
OrganizationRepository that is responsible for Objects of type Company 
*and* ScientificInstitution. The configuration is

config.tx_extbase.persistence.classes {
   Organization {
     mapping {
       tableName = party
     }
     subclasses {
       Company = Company
       ScientificInstitution = ScientificInstitution
     }
   }
   Person {
     mapping {
       tableName = party
     }
   }
   Company {
     mapping {
       tableName = party
     }
   }
   ScientificInstitution {
     mapping {
       tableName = party
     }
   }
}

As you can see, you have to define the table name for every class that 
is not stored in a table named as the lowercased class name.

There is a new option "subclasses" where you can specify, which classes 
are subclasses and should be taken into account, too. This might be a 
subset of the "real" subclasses in the class hierarchy. It might be 
puzzling, that the statement is "Company = Company". The right part is 
the class name. The left part can be any unique name (suggestion: the 
class name).

Sometimes it is not possible to store the class name as record type. 
think about mapping tt_content onto your class hierarchy. There is a 
field called "CType". You can define, that the CType "text" should be 
mapped onto your class "Tx_TemplaVoila_Domain_Model_Text". The 
configuration is:

config.tx_extbase.persistence.classes {
   Tx_TemplaVoila_Domain_Model_Text {
     mapping {
       tableName = tt_content
       recordType = text
     }
   }
}

I am sure somebody is "furbo" enough to find this configuration:

config.tx_extbase.persistence.classes {
   Client {
     mapping {
       tableName = party
       recordType = Person
     }
   }
}

in comparison to

config.tx_extbase.persistence.classes {
   Person {
     mapping {
       tableName = party
     }
   }
}

But this is very bad style. Why? I am going to spend a beer on T3DD (or 
any other event) for the best explanation. ;-)

2) Class Table Inheritance: currently not supported by Extbase.

3) Concrete Table Inheritance: There are tables for each of the concrete 
classes Company, ScientificInstitution, and Person. No further 
configuration needed. You can have a repository for each of the concrete 
classes (but not for the class Organization, yet).

4) See FLOW3 ;-)

Please test the new feature and give feedback. Are there any logical 
issues? Issues in the code? Any thoughts about the configuration options?

Regards
Jochen




More information about the TYPO3-project-typo3v4mvc mailing list