====== OpenFGA Store ======
A **Store** is the top-level container in OpenFGA. Think of it as one project or
one workspace. Everything for one authorization setup lives inside it, and
nothing leaks out to other stores.
===== Why stores exist =====
You need a boundary. Without one, all your rules and data would sit in a single
shared pile. Stores give you clean separation.
Each store is fully isolated. A Check inside store A can never see tuples that
live in store B. This lets you keep different apps, or different environments
(dev, staging, production), completely apart.
===== What is inside a store =====
A store holds three things.
^ Part ^ What it is ^
| **Authorization models** | The rules (''type'' and ''relation'' definitions). Versioned. |
| **Relationship tuples** | The data. Small facts like ''(account:123, assignee, role:manager)''. |
| **Assertions** | Saved tests: example questions with expected answers. |
==== Authorization models ====
The rules. A store can hold //many versions// of the model over time. Each
version gets its own model ID. When you change the rules, you write a new
version; the old one stays. Your tuples keep working, and you can point a Check
at a specific model version if you want.
==== Relationship tuples ====
The data. All the small facts like:
(account:123, assignee, role:manager)
This is usually the biggest part, sometimes millions of rows.
==== Assertions ====
Saved tests. You write example questions with expected answers, like "manager
should be allowed to approve → true". They let you check that your model still
behaves correctly after a change.
===== How you use a store =====
Every store has a unique **store ID** (a long string). This ID is the key to
everything.
- **Create** a store once. OpenFGA gives you back its ID.
- **Scope** every API call to that ID (write a model, add tuples, run a Check).
- **Isolate** by design. One store's data never mixes with another's.
===== How many stores should you have =====
This is a design choice, not a fixed rule. Common patterns:
* **One store per environment**: separate dev, staging, production. Safest start.
* **One store per application**: give each unrelated app its own store.
* **One store per tenant**: strong isolation, but more stores to manage. \\ Many teams instead keep all tenants in one store and separate them using object IDs (like ''organization:acme'' vs ''organization:globex'').
A good default: start with **one store per environment**, and only split further
when you have a real reason.
===== See also =====
* [[https://openfga.dev|OpenFGA official site]]
* [[https://openfga.dev/docs/getting-started/create-store|Create a store]]