When using a relational DB (such an Ecto schema with a Postgres table), usually a foreign key field has to be pre-defined with a reference pointing to a specific field in a specific table.
A simple example would be a blogging app, which might have a post
table with author
field that references the user
table.
A social network, by contrast, usually requires a graph of objects, meaning objects need to be able to refer to other objects by their ID without knowing their type.
A simple example would be likes, you might have a likes
table with liked_post_id
field that references the post
table. But what if you don’t just have posts that can be liked, but also videos, images, polls, etc, each with their own table, but probably do not want to have to add liked_video_id
, liked_image_id
, ad infinitum?
We needed the flexibility to have a foreign key that can reference any referenceable object. We call our system Needle
.
Note: This library was developed as part of the Bonfire project, which has some open bounties for any help improving performance:.
Besides regular schemas with universal foreign keys (Pointable
), Needle provides Virtual
for schemas that don’t have any fields on their own, and Mixin
for storing common fields that can be re-used by multiple Pointables or Virtuals (eg. if you have multiple types that all have a name/description/body, they can share those and optionally the associated changesets and other logic).
Needle also comes with two other homegrown libraries: needle_ulid which provides a ULID datatype for Ecto (using ex_ulid) and related helpers, and exto which enables extending Ecto schema definitions in config (especially useful for adding Mixin
associations to different schemas)…
- Needle Docs (which contain a more extensive intro and usage guide)
- needle | Hex