# 05: progressive construction

At the beginning of this tutorial, I told you that `add-ents` takes an ent db as an argument:

```
(sm/add-ents {:schema schema} {:post [[1]]})
```

You may have wondered why the empty ent db `{:schema schema}` is used, rather than just directly passing in `schema`; why don't we just write this?

```
(sm/add-ents schema {:post [[1]]})
```

The reason the first argument to `add-ents` is an ent db is so you can take the return value of `add-ents` and pass it in as the first argument to further calls to `add-ents`:

```scheme
(ns reifyhealth.specmonstah-tutorial.05
  (:require [reifyhealth.specmonstah.core :as sm]))

(def schema
  {:user  {:prefix :u}
   :topic {:prefix    :t
           :relations {:owner-id [:user :id]}}})

(defn ex-01
  []
  (let [ent-db-1 (sm/add-ents {:schema schema} {:topic [[1]]})
        ent-db-2 (sm/add-ents ent-db-1 {:topic [[1]
                                                [1 {:refs {:owner-id :hamburglar}}]]})]
    (sm/view ent-db-1)
    (sm/view ent-db-2)))

(ex-01)

```

Additional calls to `add-ents` are additive; they will never alter existing ents, and will only add new ents. The first call, `(sm/add-ents {:schema schema} {:topic [[1]]})`, produces a `:topic` named `:t0` referencing a `:user` named `:u0`:

![](https://4068685904-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoN3fu4ydp8osDZFQch%2F-LowUOLmin_zLVtJkSYY%2F-LowVqSUbB0Bn9mSXCVv%2Fprogressive.png?alt=media\&token=bbe27b25-e3b8-48ff-a36b-079bdfcb4b2c)

That ent db is passed to the next call:

```scheme
(sm/add-ents ent-db-1 {:topic [[1]
                               [1 {:refs {:owner-id :hamburglar}}]]})
```

This creates two more topics:

![](https://4068685904-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoN3fu4ydp8osDZFQch%2F-LowUOLmin_zLVtJkSYY%2F-LowVtEuqjPJ14HeBptp%2Fprogressive-1.png?alt=media\&token=007420cb-af87-40ef-af1f-4ba7ebf45be0)

The default naming system picks up where it left off, giving the topic the names `:t1` and `:t2`. `:t1` references the existing user, `:u0`, and `:t2` references a new user from the `:refs`, `:hamburglar`. When progressively generating an ent-db, you can expect Specmonstah to behave as if all queries were passed as a single query to a single call of `add-ents`.

Everything you've learned up to this point has focused on generating an ent db: you've learned a bit about how to use schemas and queries together to concisely specify what ents to create. You've also learned how to customize the relationships with the `:refs` query option.

In the next couple sections, you'll learn about how Specmonstah uses *visitation* to generate and insert business data.
