Index: openacs-4/packages/acs-core-docs/www/object-identity.html =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-core-docs/www/object-identity.html,v diff -u -N -r1.49.2.10 -r1.49.2.11 --- openacs-4/packages/acs-core-docs/www/object-identity.html 21 Jun 2016 07:44:36 -0000 1.49.2.10 +++ openacs-4/packages/acs-core-docs/www/object-identity.html 23 Jun 2016 08:32:45 -0000 1.49.2.11 @@ -13,22 +13,22 @@ implied identity. Every mapping between a user and a group could have an arbitrary number of attached values (user_group_member_fields, etc.). In this case it is the pair (group_id, user_id) that implicitly refers to an -object (the person's membership in a group). In the 5.9.0 data model this +object (the person's membership in a group). In the 5.9.0 data model this object identity is made explicit by adding an integer primary key to the table that maps users to groups.

Coming from a purely relational world, this might seem slightly weird at first. The pair (group_id, user_id) is sufficient to uniquely identify the object in question, so why have the redundant integer primary key? If you -take a closer look, it actually isn't quite so redundant. If you want to -be able to use the object model's permissioning features, and generic +take a closer look, it actually isn't quite so redundant. If you want to +be able to use the object model's permissioning features, and generic attribute features on a table, you need an integer primary key for that -table. This is because you can't really write a data model in oracle that +table. This is because you can't really write a data model in oracle that uses more than one way to represent identity.

So, this apparently redundant primary key has saved us the trouble of duplicating the entire generic storage system for the special case of the user_group_map, and has saved us from implementing ad-hoc security instead of just using acs-permissions. This design choice is further validated by the -fact that services like journals that weren't previously thought to be +fact that services like journals that weren't previously thought to be generic can in fact be generically applied to membership objects, thereby -allowing us to eliminated membership state auditing columns that weren't +allowing us to eliminated membership state auditing columns that weren't even capable of fully tracking the history of membership state.

The design choice of explicitly representing object identity with an integer primary key that is derived from a globally unique sequence is the key to eliminating redundant code and replacing it with generic object