If you want 3 tables, you can do it like this: **tables** - `table_id, name, created_at, updated_at` **rows** - `row_id, table_id, row_type, row_pos, created_at, updated_at` **columns** - `column_id, table_id, row_id, column_pos, column_val, created_at, updated_at` `row_type` because a row can also have table headers. You can set it enum to indicate it's `header` or `data`. ### Alternative and better way: ### `Tables` table |TableID|TableName|Rows|Colls| `TableData` table |TableDataId|TableID|Row|Column|Details|