10: uniqueness constraint
If you're building a forum and want people to be able to like posts, you probably don't want to allow people to like the same post twice. If your schema is something like this:
like
post-id
user-id
Then you probably have a constraint such that you can't have two records with the same post-id
and user-id
. How do you model this in Specmonstah? So far, we've seen schemas like this:
If you use this to generate ents, you'll end up in a disappointing situation:
All the likes reference the same :post
(:p0
) and :user
(:u0
). This happens because Specmonstah generates the minimal data needed to satisfy a query.
To get Specmonstah to generate data that your database will accept, you introduce a uniqueness constraint in the schema:
Notice the :constraints
key at the bottom of the schema. This tells Specmonstah, "The :created-by-id
relation of every :like
should refer to a unique :user
. If you generate multiple :like
s, generate new :user
s too until each like refers to a differ :user
."
This schema will generate a graph that will satisfy your database's constraints:
You could have instead added the :uniq
constraint to :post-id
, and it would have generated new :post
s instead of :user
s. Give it a try :) Or, try adding the constraint to both :post-id
and :created-by-id
.
Last updated