diff --git a/arkindex/documents/migrations/0003_cache.py b/arkindex/documents/migrations/0003_cache.py
new file mode 100644
index 0000000000000000000000000000000000000000..3a122d800089b490e15d025ce12192ae13ae1de5
--- /dev/null
+++ b/arkindex/documents/migrations/0003_cache.py
@@ -0,0 +1,63 @@
+# Generated by Django 2.0 on 2018-05-18 08:09
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('documents', '0002_element_zone'),
+    ]
+
+    operations = [
+        migrations.RunSQL(
+            """
+            create materialized view elements_parents_cache as
+            (
+                select * from elements_parents
+            );
+            """,
+            reverse_sql="drop materialized view if exists elements_parents_cache;"
+        ),
+        migrations.RunSQL(
+            """
+            create materialized view elements_children_cache as
+            (
+                select * from elements_children
+            );
+            """,
+            reverse_sql="drop materialized view if exists elements_children_cache;"
+        ),
+        migrations.RunSQL(
+            """
+            create index idx_elements_parents_cache_id on elements_parents_cache (id);
+            """,
+            reverse_sql="drop index if exists idx_elements_parents_cache_id;"
+        ),
+        migrations.RunSQL(
+            """
+            create index idx_elements_parents_cache_parent on elements_parents_cache (parent_id);
+            """,
+            reverse_sql="drop index if exists idx_elements_parents_cache_parent;"
+        ),
+        migrations.RunSQL(
+            """
+            create index idx_elements_children_cache_id on elements_children_cache (id);
+            """,
+            reverse_sql="drop index if exists idx_elements_children_cache_id;"
+        ),
+        migrations.RunSQL(
+            """
+            create index idx_elements_children_cache_child on elements_children_cache (child_id);
+            """,
+            reverse_sql="drop index if exists idx_elements_children_cache_child;"
+        ),
+        migrations.AlterModelTable(
+            name='elementchildren',
+            table='elements_children_cache',
+        ),
+        migrations.AlterModelTable(
+            name='elementparents',
+            table='elements_parents_cache',
+        ),
+    ]
diff --git a/arkindex/documents/models.py b/arkindex/documents/models.py
index 2834783b1a32d8a8cb7616427799451f7dd9f42d..fb0df1486f7816b39f6aa67f68c9229f335e7908 100644
--- a/arkindex/documents/models.py
+++ b/arkindex/documents/models.py
@@ -40,7 +40,7 @@ class ElementParents(models.Model):
 
     class Meta:
         managed = False
-        db_table = 'elements_parents'
+        db_table = 'elements_parents_cache'
 
 
 class ElementChildren(models.Model):
@@ -51,7 +51,7 @@ class ElementChildren(models.Model):
 
     class Meta:
         managed = False
-        db_table = 'elements_children'
+        db_table = 'elements_children_cache'
 
 
 class Element(IndexableModel):