It's perfectly legitimate to have ScriptData that contains only datum values. This is the case if you are creating a transaction with an output containing a datum hash and the datum lives in the witness set.
In this scenario, the hash becomes
hash(0xa0 + cbor_bytes(datum) + 0xa0)
This scenario is not accounted for in the ScriptData structure and it assumes that Redeemer is required.

It's perfectly legitimate to have ScriptData that contains only datum values. This is the case if you are creating a transaction with an output containing a datum hash and the datum lives in the witness set.
In this scenario, the hash becomes
This scenario is not accounted for in the ScriptData structure and it assumes that
Redeemeris required.