EDU: Notes – Core: User: History
By Sol in Lab
Requirements
- Create “paper trail” of changes made to user
- Role, grade, position, etc.
- Date-based
- Track any type of change for any type of user
- Students, teachers, administration, etc.
- Allow retrieval of full user history
- Allow retrieval of history of based on relationships/connections between content types
- Example: Retrieve history of a class by finding all teachers associated with class in their histories
- Allow queries for users based on properties in history
- Example: Find all students who have had a class with a specific teacher
Data Storage (Options)
- User metadata (separate records)
- Store history in built-in
wp_usermeta
database table
- Methodology: Changing a property for a user
- Save old property value in special meta key:
hist_{property-name}
{property-name}
is property being changed
- Set new property value in default meta key:
{property-name}
-
Changes not dated
- Option: Could store date with old value as serialized data
-
Would need to parse/sort full query before results based on specific properties/values could be returned
+
Simple to query based on meta key
- Find all users with specified property/value combination
?
Can user metadata store multiple items with same key for user? (ala post meta)
- User metadata (serialized data)
- Entire user history stored in single row for user in built-in
wp_usermeta
database table
- Data stored as serialized array
- Key: Timestamp of user property change
- Value: Object/array of properties/values
-
Must query all users’ histories before any connections can be made
+
Keeps wp_usermeta
table cleaner
- Separate database table
- User history stored in bespoke database table(s):
user_history
- Structure (schema)
id
: Unique row ID
user_id
: User ID
date
: Timestamp of property/value change
property
: Property being set/changed
value
: New value of property
- Example: Student grade-level change
id
: Automatically set
user_id
: {user-id}
(ID from wp_users
table)
date
: Current date time
property
: “grade-level”
value
: 2
?
Current user properties: How to manage/query? (Options)
- Mirror current properties/values in user metadata
- History table used primarily for past history
- All current user data should be accessed from user metadata
- History updated when property changed/set
+
Can perform queries for current data using metadata (all students in class “x”, etc.)
-
Duplication of data: wp_usermeta
/user_history
- Not too much of an issue because history only used for archival purposes (e.g. not validating current user properties)
- Add
current
column to user history table
- Flag indicates row contains latest data for user property
-
Must unset previous row flagged as current when setting new data
+
Simple to query current data using where clause
...WHERE current = true
- Use
date
column
- Query only latest matching rows
- Unique rows sorted by
date
column
- Will return most recent row of each property for user
?
How to retrieve multiple properties with same key for user?
- Example: Student may currently be in multiple classes (and assigned to each class at different times)
-
Only most recently-set class would be returned for student
Properties with multiple values (Options)
Examples
- Student in multiple classes in current semester
- Teacher teaching multiple classes in current semester
- Serialized property value
- Store data as array
-
Does not track granular changes
- Example: Single class changed while others remain
- Multiple rows with same property
- Example: Separate row for each class that student is enrolled in
+
Current classes managed as user metadata
- History just for chronological record
- Dates of property changes “tells the story” of user’s changes