On Tuesday, 19 July 2022 at 17:05:27 UTC, Kagamin wrote:
> Also what's the difference between null and empty phone number?
In a relational database, NULL
is not the same that ""
... and NULL
is not the same that 0
. Are semantically different and there are database invariants (like foreign keys) based on it. Trying to "mix" this concepts in a database is a mistake.
When you treat with Domain Models, you try to represent this semantics in all levels of your software... including APIs
If your address has not a reference to the city... then there is a city_code
field with NULL
value in your database and the Address model object has a city property representing this Null value with the tools that language/library offers to you: Nullable!City
or Sumtype!(Null, City)
or Optional<City>
or ...).
Null
is then a valid value state that has nothing related to null
pointers... to avoid confusion, I talk about Null
instead null
.
I, personally, prefer to use Union types (algebraic types) like int | Null | ...
because it is the best option to introduce the Undefined state (that allows statically typed data to represent the absence of a property).
Sumtype!(Undefined,Null,int)
instead Optional!(Nullable!int)
Then there is the match!
syntax, the unified way to treat JSON serialization and the easy way to implement a custom "dot" accessor that propagates the Null or Undefined state in a chain of references:
person.ns.address.ns.city.ns.name.match!(
(string name){ ... }
(Null) {...}
(Undefined) { ... }
)