A database with two tables: A "record" table and a "link" table, each with a very few attributes. All intelligence coming out of the database is the product of joins between those two tables. For more information, and a more accurate description, see ProximitySoftware. Even better: a database with a "relation" table for storing binary relations of various classes, a one-column table of objects, and a set of tables for holding "fields" of various data types. Each field gets a field class. Implementing collections in such a monster is a matter of defining more than one instance of a field for a particular object. So, rather than two tables, you have one table for a particular data type in the underlying database system. A bignum_fields and long_int_fields table, for example, and a text_blob_fields table. Advantages: * not so hard to coerce these things into NormalForm. * the data structure is way more flexible, and can be modified and extended very cheaply * space savings * semantically, relation fields are different from other big_int entries. Deriving structure becomes a bit easier. Disadvantages: * essentially you're implementing a database in a database. * concurrency becomes more of an issue than with table-level locking. * you're marshalling objects into a referential system. * it can get silly very quickly. -------- See Also: DynamicRelational EntityAttributeValue