HiveBrain v1.2.0
Get Started
← Back to all entries
patternsqlMinor

Table structure/schema for spreadsheet-like web app (ex: Google Docs)?

Submitted by: @import:stackexchange-dba··
0
Viewed 0 times
googledocsapptablelikespreadsheetstructureforwebschema

Problem

I'm a front-end developer/designer who is trying to branch out and learn more about the back-end world. I've chosen Python, Django, and Postgres as my starting place. My goal is to build a personal web app, and use that as my catalyst for learning. It's been really fun.

I'm at the stage where I'm designing the data model. I would normally tinker and figure things out, but in this case I'm curious what is possible.

A good analogy for my app's data model is a spreadsheet. The user can create a "spreadsheet", then determine "columns", and subsequently the data type per column.

So, as a pure example, a new sheet has the following columns:

Name (text)
Cost (number / currency)
Date (time stamp
Frequency (number)
Notes (text)


Then, "rows" can be added where each entry has values for name/cost/date/frequency/notes, as well as some meta data like who created the row, at what time, etc.

I'm unsure what is the best schema to accomplish this example. Below is the best idea I came up with. I'm wondering if anyone would be willing to comment on whether this is the best approach, or give feedback on a different direction.

Solution

I've never attempted something like this, but maybe a schema such as this would work:

Spreadsheet
spreadsheet_id (unique key)
name
num_rows
num_cols

column_types
type_id (unique key)
type_name

spreadsheet_rows
spreadsheet_row_id (unique key)
spreadsheet_id (refers to spreadsheet.spreadsheet_id)
row_seq_num (for on-screen row-ordering)
row_name

spreadsheet_cols
spreadsheet_col_id (unique key)
spreadsheet_id (refers to spreadsheet.spreadsheet_id)
col_seq_num (for on-screen column-ordering)
column_type_id (refers to column_types.type_id)
column_name

spreadsheet_cells
cell_id (unique key)
spreadsheet_id (refers to spreadsheet.spreadsheet_id)
row_id (refers to spreadsheet_rows.spreadsheet_row_id)
col_id (refers to spreadsheet_cols.spreadsheet_col_id)
cell_value (holds the actual value!)

Of course you'd only create records in spreadsheet_cells for non-null values...

Context

StackExchange Database Administrators Q#13047, answer score: 6

Revisions (0)

No revisions yet.