But how can we (in an OLTP environment) "nullify" an attribute that was previously known?
Let's say that at point in time T1, for an entity E1, we store two attributes A1 and A2 into 6NF tables.
Table for A1 attribute:
====================
#id A1 validFrom
-------------------------------------
4711 "black" T1
Table for A2 attribute:
====================
#id A2 validFrom
-------------------------------------
4711 42 T1
Then at point in time T2, we only store changed attribute values and do not store unchanged attribute values: only A1 has changed but not A2, and the tables becomes like this:
6NF Table for A1 attribute:
====================
#id A1 validFrom
-------------------------------------
4711 "black" T1
4711 "red" T2
6NF Table for A2 attribute:
====================
#id A2 validFrom
-------------------------------------
4711 42 T1
At point in time T3, we then query using the function that returns the latest values for the E1, then we would see the results (in 3NF):
View
====================
#id A1 A2
-------------------------------------
4711 "red" 42
Now suppose at T4, I want to "nullify" the value of A2, so that if I were to query using the function that returns latest values for E1, it would return (in 3NF):
View
====================
#id A1 A2
-------------------------------------
4711 "red" null
How could we achieve this if null values are not allowed in 6NF? If the attribute type was a String, then perhaps I can store NULL as the string "NULL". What would be the canonical integer value for representing a NULL be for A2? And how can the view make this transparent to the developer without leaking the abstraction through from 6NF to 3NF?