Every permutation and its outcome at the key and index level. I have removed the following invalid scenarios:
- There are no "update" operations on the main table index (it's immutable)
- Only secondary indexes can have a "condition" function
- The condition function will never be called when the "PK Composites Provided" and "SK Composites Provided" are both none
Row | Impacted Index Type | PK Composites Provided | SK Composites Provided | Condition Present | Condition Returns | Throws | PK Action | SK Action | Index Outcome |
---|---|---|---|---|---|---|---|---|---|
1 | table | none | none | false | - | true | n/a | n/a | n/a |
2 | table | none | some | false | - | true | n/a | n/a | n/a |
3 | table | none | all | false | - | true | n/a | n/a | n/a |
4 | table | some | none | false | - | true | n/a | n/a | n/a |
5 | table | some | some | false | - | true | n/a | n/a | n/a |
6 | table | some | all | false | - | true | n/a | n/a | n/a |
7 | table | all | none | false | - | true | n/a | n/a | n/a |
8 | table | all | some | false | - | true | n/a | n/a | n/a |
9 | table | all | all | false | - | false | write | write | present |
10 | secondary | none | some | true | true | false | skip | write | absent |
11 | secondary | none | some | true | false | false | skip | skip | absent |
12 | secondary | none | some | false | - | false | skip | write | absent |
13 | secondary | none | all | true | true | false | skip | write | absent |
14 | secondary | none | all | true | false | false | skip | skip | absent |
15 | secondary | none | all | false | - | false | skip | write | absent |
16 | secondary | some | none | true | true | false | skip | write | absent |
17 | secondary | some | none | true | false | false | skip | write | absent |
18 | secondary | some | none | false | - | false | skip | write | absent |
19 | secondary | some | some | true | true | false | skip | write | absent |
20 | secondary | some | some | true | false | false | skip | skip | absent |
21 | secondary | some | some | false | - | false | skip | write | absent |
22 | secondary | some | all | true | true | false | skip | write | absent |
23 | secondary | some | all | true | false | false | skip | skip | absent |
24 | secondary | some | all | false | - | false | skip | write | absent |
25 | secondary | all | none | true | true | false | write | write | present |
26 | secondary | all | none | true | false | false | skip | skip | absent |
27 | secondary | all | none | false | - | false | write | write | present |
28 | secondary | all | some | true | true | false | write | write | present |
29 | secondary | all | some | true | false | false | skip | skip | absent |
30 | secondary | all | some | false | - | false | write | write | present |
31 | secondary | all | all | true | true | false | write | write | present |
32 | secondary | all | all | true | false | false | skip | skip | absent |
33 | secondary | all | all | false | - | false | write | write | present |
All composite keys for the table index are required; without them, ElectroDB will be unable to form the item's key identifiers.
Action throws so the item will not be created.
Action throws so the item will not be created.
Action throws so the item will not be created.
All composite keys for the table index are required; without them, ElectroDB will be unable to form the item's key identifiers.
Action throws so the item will not be created.
Action throws so the item will not be created.
Action throws so the item will not be created.
All composite keys for the table index are required; without them, ElectroDB will be unable to form the item's key identifiers.
Action throws so the item will not be created.
Action throws so the item will not be created.
Action throws so the item will not be created.
All composite keys for the table index are required; without them, ElectroDB will be unable to form the item's key identifiers.
Action throws so the item will not be created.
Action throws so the item will not be created.
Action throws so the item will not be created.
All composite keys for the table index are required; without them, ElectroDB will be unable to form the item's key identifiers.
Action throws so the item will not be created.
Action throws so the item will not be created.
Action throws so the item will not be created.
All composite keys for the table index are required; without them, ElectroDB will be unable to form the item's key identifiers.
Action throws so the item will not be created.
Action throws so the item will not be created.
Action throws so the item will not be created.
All composite keys for the table index are required; without them, ElectroDB will be unable to form the item's key identifiers.
Action throws so the item will not be created.
Action throws so the item will not be created.
Action throws so the item will not be created.
All composite keys for the table index are required; without them, ElectroDB will be unable to form the item's key identifiers.
Action throws so the item will not be created.
Action throws so the item will not be created.
Action throws so the item will not be created.
All composite keys for the table index are provided, the item can be created.
All composite keys for the table index are provided, the item's identifiers can be formed.
All composite keys for the table index are provided, the item's identifiers can be formed.
All composite keys for the table index are provided, the item's identifiers can be formed so the index appears on this index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
Without PK attributes, the PK cannot be formed which means it won't be accessible and therefore it is not written.
The sort key will be written to the extent that it can be formatted.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB will not write the key because the user's condition
callback returned a false
value.
ElectroDB will not write the key because the user's condition
callback returned a false
value.
The item will not be present on the index because the user returned a false
value from their condition callback
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
No key will be written because none of composite attributes were provided, making it unable to format the key.
ElectroDB will write the sort key to the extent that it can be formatted; this will ensure that the item's sort key is in sync with the attributes on the item.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
No key will be written because none of composite attributes were provided, making it unable to format the key.
ElectroDB will write the sort key to the extent that it can be formatted; this will ensure that the item's sort key is in sync with the attributes on the item.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
No key will be written because none of composite attributes were provided, making it unable to format the key. Also, the key will not be written because the user returned a false
value from their condition callback.
ElectroDB will not write the key because the user's condition
callback returned a false
value.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index. Also the item will not be present on the index because the user returned a false
value from their condition callback.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
No key will be written because none of composite attributes were provided, making it unable to format the key.
ElectroDB will write the sort key to the extent that it can be formatted; this will ensure that the item's sort key is in sync with the attributes on the item.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB will not write a PK value because some composite attributes were not provided, therefore ElectroDB will be unable to format the entire key. On the query side, it would not be possible to access this item because the PK is not complete.
ElectroDB will complete the SK to its fullest extent. If this is surprising to the reader, consider that if the sort key is formatted such that it has non-value prefixes (e.g., the default ElectroDB template prefixes the sort key with the entity name and version), Electro includes these values when performing a query without providing sort key attributes. Writing this prefix will ensure the item is accessible if the user queries for items without providing sort key attributes.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB will not write a PK value because some composite attributes were not provided, therefore ElectroDB will be unable to format the entire key. On the query side, it would not be possible to access this item because the PK is not complete.
ElectroDB will complete the SK to its fullest extent. If this is surprising to the reader, consider that if the sort key is formatted such that it has non-value prefixes (e.g., the default ElectroDB template prefixes the sort key with the entity name and version), Electro includes these values when performing a query without providing sort key attributes. Writing this prefix will ensure the item is accessible if the user queries for items without providing sort key attributes.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB will not write a PK value because some composite attributes were not provided, therefore ElectroDB will be unable to format the entire key. On the query side, it would not be possible to access this item because the PK is not complete.
ElectroDB will complete the SK to its fullest extent. If this is surprising to the reader, consider that if the sort key is formatted such that it has non-value prefixes (e.g., the default ElectroDB template prefixes the sort key with the entity name and version), Electro includes these values when performing a query without providing sort key attributes. Writing this prefix will ensure the item is accessible if the user queries for items without providing sort key attributes.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB will not write a PK value because some composite attributes were not provided, therefore ElectroDB will be unable to format the entire key. On the query side, it would not be possible to access this item because the PK is not complete.
ElectroDB will write the sort key to the extent that it can be formatted; this will ensure that the item's sort key is in sync with the attributes on the item.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB will not write the key because the user's condition
callback returned a false
value.
ElectroDB will not write the key because the user's condition
callback returned a false
value.
The item will not be present on the index because the user returned a false
value from their condition callback. Also, because the PK could not be formed, it was skipped and therefore the item will not be present on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB will not write a PK value because some composite attributes were not provided, therefore ElectroDB will be unable to format the entire key. On the query side, it would not be possible to access this item because the PK is not complete.
ElectroDB will write the sort key to the extent that it can be formatted; this will ensure that the item's sort key is in sync with the attributes on the item.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB will not write a PK value because some composite attributes were not provided, therefore ElectroDB will be unable to format the entire key. On the query side, it would not be possible to access this item because the PK is not complete.
ElectroDB will write the sort key to the extent that it can be formatted; this will ensure that the item's sort key is in sync with the attributes on the item.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB will not write a PK value because some composite attributes were not provided, therefore ElectroDB will be unable to format the entire key. On the query side, it would not be possible to access this item because the PK is not complete.
ElectroDB will not write the key because the user's condition
callback returned a false
value.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB will not write a PK value because some composite attributes were not provided, therefore ElectroDB will be unable to format the entire key. On the query side, it would not be possible to access this item because the PK is not complete.
ElectroDB will write the sort key to the extent that it can be formatted; this will ensure that the item's sort key is in sync with the attributes on the item.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB was provided all composite key attributes, allowing the full PK to be written.
ElectroDB will complete the SK to its fullest extent. If this is surprising to the reader, consider that if the sort key is formatted such that it has non-value prefixes (e.g., the default ElectroDB template prefixes the sort key with the entity name and version), Electro includes these values when performing a query without providing sort key attributes. Writing this prefix will ensure the item is accessible if the user queries for items without providing sort key attributes.
ElectroDB will write both the PK and SK keys, which will make the item present on item.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB will not write the key because the user's condition
callback returned a false
value.
ElectroDB will not write the key because the user's condition
callback returned a false
value.
The item will not be present on the index because the user returned a false
value from their condition callback. Also, because the PK could not be formed, it was skipped and therefore the item will not be present on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB was provided all composite key attributes, allowing the full PK to be written.
ElectroDB will complete the SK to its fullest extent. If this is surprising to the reader, consider that if the sort key is formatted such that it has non-value prefixes (e.g., the default ElectroDB template prefixes the sort key with the entity name and version), Electro includes these values when performing a query without providing sort key attributes. Writing this prefix will ensure the item is accessible if the user queries for items without providing sort key attributes.
ElectroDB will write both the PK and SK keys, which will make the item present on item.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB was provided all composite key attributes, allowing the full PK to be written.
ElectroDB will write the sort key to the extent that it can be formatted; this will ensure that the item's sort key is in sync with the attributes on the item.
ElectroDB will write both the PK and SK keys, which will make the item present on item.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB will not write the key because the user's condition
callback returned a false
value.
ElectroDB will not write the key because the user's condition
callback returned a false
value.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB was provided all composite key attributes, allowing the full PK to be written.
ElectroDB will write the sort key to the extent that it can be formatted; this will ensure that the item's sort key is in sync with the attributes on the item.
ElectroDB will write both the PK and SK keys, which will make the item present on item.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB was provided all composite key attributes, allowing the full PK to be written.
ElectroDB will write the sort key to the extent that it can be formatted; this will ensure that the item's sort key is in sync with the attributes on the item.
ElectroDB will write both the PK and SK keys, which will make the item present on item.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB will not write the key because the user's condition
callback returned a false
value.
ElectroDB will not write the key because the user's condition
callback returned a false
value.
ElectroDB could not fully form the PK, therefore it will not write a PK value, removing the item's presence on the index.
The create operation would overwrite any existing record, so partial keys will not result in out-of-sync attributes/keys. The item can be safely created, so ElectroDB will not throw.
ElectroDB was provided all composite key attributes, allowing the full PK to be written.
ElectroDB will write the sort key to the extent that it can be formatted; this will ensure that the item's sort key is in sync with the attributes on the item.
ElectroDB will write both the PK and SK keys, which will make the item present on item.
Row | Impacted Index Type | PK Composites Provided | SK Composites Provided | Condition Present | Condition Returns | Throws | PK Action | SK Action | Index Outcome |
---|---|---|---|---|---|---|---|---|---|
1 | secondary | none | some | true | true | true | n/a | n/a | n/a |
2 | secondary | none | some | true | false | false | delete | delete | absent |
3 | secondary | none | some | false | true | n/a | n/a | n/a | |
4 | secondary | none | all | true | true | true | n/a | n/a | n/a |
5 | secondary | none | all | true | false | false | delete | delete | absent |
6 | secondary | none | all | false | false | skip | write | unknown | |
7 | secondary | some | none | true | true | true | n/a | n/a | n/a |
8 | secondary | some | none | true | false | false | delete | delete | absent |
9 | secondary | some | none | false | true | n/a | n/a | n/a | |
10 | secondary | some | some | true | true | true | n/a | n/a | n/a |
11 | secondary | some | some | true | false | false | delete | delete | absent |
12 | secondary | some | some | false | true | n/a | n/a | n/a | |
13 | secondary | some | all | true | true | true | n/a | n/a | n/a |
14 | secondary | some | all | true | false | false | delete | delete | absent |
15 | secondary | some | all | false | true | n/a | n/a | n/a | |
16 | secondary | all | none | true | true | true | n/a | n/a | n/a |
17 | secondary | all | none | true | false | false | delete | delete | absent |
18 | secondary | all | none | false | false | write | skip | present | |
19 | secondary | all | some | true | true | true | n/a | n/a | n/a |
20 | secondary | all | some | true | false | false | delete | delete | absent |
21 | secondary | all | some | false | true | n/a | n/a | n/a | |
22 | secondary | all | all | true | true | false | write | write | present |
23 | secondary | all | all | true | false | false | delete | delete | absent |
24 | secondary | all | all | false | false | write | write | present |
Attempting to write a key with only some of the composite attributes will throw an error because the update risks creating an inconsistency between the key's values and the contributing attribute's values. To avoid this error, provide all members of an index's composite key (either via set
or using the composite
method).
Action throws so the item is not updated.
Action throws so the item is not updated.
Action throws so the item is not updated.
The condition callback returned false
, so the update will delete the associated index keys.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB delete the keys to this index because the user's condition
callback returned a false
value.
Attempting to write a key with only some of the composite attributes will throw an error because the update risks creating an inconsistency between the key's values and the contributing attribute's values. To avoid this error, provide all members of an index's composite key (either via set
or using the composite
method).
Action throws so the item is not updated.
Action throws so the item is not updated.
Action throws so the item is not updated.
Attempting to write a key with only some of the composite attributes will throw an error because the update risks creating an inconsistency between the key's values and the contributing attribute's values. To avoid this error, provide all members of an index's composite key (either via set
or using the composite
method).
Action throws so the item is not updated.
Action throws so the item is not updated.
Action throws so the item is not updated.
The condition callback returned false
, so the update will delete the associated index keys.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB delete the keys to this index because the user's condition
callback returned a false
value.
Key attribute were either all provided in their entirety or not at all; no need to throw.
Key not impacted by update, no need to apply change.
The PK was not impacted by the update, so the index will not be impacted either. The item will remain present or absent on the index depending on the current state of the item in DynamoDB.
Attempting to write a key with only some of the composite attributes will throw an error because the update risks creating an inconsistency between the key's values and the contributing attribute's values. To avoid this error, provide all members of an index's composite key (either via set
or using the composite
method).
Action throws so the item is not updated.
Action throws so the item is not updated.
Action throws so the item is not updated.
The condition callback returned false
, so the update will delete the associated index keys.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB delete the keys to this index because the user's condition
callback returned a false
value.
Attempting to write a key with only some of the composite attributes will throw an error because the update risks creating an inconsistency between the key's values and the contributing attribute's values. To avoid this error, provide all members of an index's composite key (either via set
or using the composite
method).
Action throws so the item is not updated.
Action throws so the item is not updated.
Action throws so the item is not updated.
Attempting to write a key with only some of the composite attributes will throw an error because the update risks creating an inconsistency between the key's values and the contributing attribute's values. To avoid this error, provide all members of an index's composite key (either via set
or using the composite
method).
Action throws so the item is not updated.
Action throws so the item is not updated.
Action throws so the item is not updated.
The condition callback returned false
, so the update will delete the associated index keys.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB delete the keys to this index because the user's condition
callback returned a false
value.
Attempting to write a key with only some of the composite attributes will throw an error because the update risks creating an inconsistency between the key's values and the contributing attribute's values. To avoid this error, provide all members of an index's composite key (either via set
or using the composite
method).
Action throws so the item is not updated.
Action throws so the item is not updated.
Action throws so the item is not updated.
Attempting to write a key with only some of the composite attributes will throw an error because the update risks creating an inconsistency between the key's values and the contributing attribute's values. To avoid this error, provide all members of an index's composite key (either via set
or using the composite
method).
Action throws so the item is not updated.
Action throws so the item is not updated.
Action throws so the item is not updated.
The condition callback returned false
, so the update will delete the associated index keys.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB delete the keys to this index because the user's condition
callback returned a false
value.
Attempting to write a key with only some of the composite attributes will throw an error because the update risks creating an inconsistency between the key's values and the contributing attribute's values. To avoid this error, provide all members of an index's composite key (either via set
or using the composite
method).
Action throws so the item is not updated.
Action throws so the item is not updated.
Action throws so the item is not updated.
Attempting to write a key with only some of the composite attributes will throw an error because the update risks creating an inconsistency between the key's values and the contributing attribute's values. To avoid this error, provide all members of an index's composite key (either via set
or using the composite
method).
Action throws so the item is not updated.
Action throws so the item is not updated.
Action throws so the item is not updated.
The condition callback returned false
, so the update will delete the associated index keys.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB delete the keys to this index because the user's condition
callback returned a false
value.
Key attribute were either all provided in their entirety or not at all; no need to throw.
The key will be written because all of its composite attributes were provided, making it possible to format the key.
Key not impacted by update, no need to apply change.
The PK was written on this update so we know the item will exist on the index after the update is applied.
Attempting to write a key with only some of the composite attributes will throw an error because the update risks creating an inconsistency between the key's values and the contributing attribute's values. To avoid this error, provide all members of an index's composite key (either via set
or using the composite
method).
Action throws so the item is not updated.
Action throws so the item is not updated.
Action throws so the item is not updated.
The condition callback returned false
, so the update will delete the associated index keys.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB delete the keys to this index because the user's condition
callback returned a false
value.
Attempting to write a key with only some of the composite attributes will throw an error because the update risks creating an inconsistency between the key's values and the contributing attribute's values. To avoid this error, provide all members of an index's composite key (either via set
or using the composite
method).
Action throws so the item is not updated.
Action throws so the item is not updated.
Action throws so the item is not updated.
Key attribute were either all provided in their entirety or not at all; no need to throw.
The key will be written because all of its composite attributes were provided, making it possible to format the key.
The key will be written because all of its composite attributes were provided, making it possible to format the key.
The PK was written on this update so we know the item will exist on the index after the update is applied.
The condition callback returned false
, so the update will delete the associated index keys.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB will delete this key because the user's condition
callback returned a false
value.
ElectroDB delete the keys to this index because the user's condition
callback returned a false
value.
Key attribute were either all provided in their entirety or not at all; no need to throw.
The key will be written because all of its composite attributes were provided, making it possible to format the key.
The key will be written because all of its composite attributes were provided, making it possible to format the key.
The PK was written on this update so we know the item will exist on the index after the update is applied.
@tywalch Gonna take be a bit to digest all of this. Working with 57 abstract scenarios is much harder for me then examples haha. However I do have some first questions.
none
andskip
in the PK/SK action columns?none
andabsent
in the Index outcome column?some
SK attributes are provided. For example row 11 and 12 or more concerning rows 28 & 30. Wouldn't any write operation to the SK when we only have some of the attributes create consistency issues? Without a PK I guess this could be minor as one would not really be able to query on this index anyway. However in 28 & 30 this item does end up in the index and the SK would be inconsistent.