For historical reasons, we've ended up with quite a few database tables names
that aren't aligned with the model names. I think in every case we prefer the
model names (since these are easier to change, they tend to have been changed
already without renaming the underlying table).
```bash
andy@denali:~/src/openstreetmap-website$ grep -rn 'self\.table_name' app/models/
app/models/old_way.rb:24: self.table_name = "ways"
app/models/old_way_tag.rb:16: self.table_name = "way_tags"
app/models/way_tag.rb:15: self.table_name = "current_way_tags"
app/models/tracepoint.rb:26: self.table_name = "gps_points"
app/models/trace.rb:31: self.table_name = "gpx_files"
app/models/way_node.rb:20: self.table_name = "current_way_nodes"
app/models/relation_member.rb:21: self.table_name = "current_relation_members"
app/models/node.rb:31: self.table_name = "current_nodes"
app/models/way.rb:26: self.table_name = "current_ways"
app/models/old_way_node.rb:20: self.table_name = "way_nodes"
app/models/old_relation_tag.rb:16: self.table_name = "relation_tags"
app/models/old_relation.rb:24: self.table_name = "relations"
app/models/relation.rb:26: self.table_name = "current_relations"
app/models/old_relation_member.rb:22: self.table_name = "relation_members"
app/models/node_tag.rb:15: self.table_name = "current_node_tags"
app/models/old_node.rb:30: self.table_name = "nodes"
app/models/relation_tag.rb:15: self.table_name = "current_relation_tags"
app/models/follow.rb:22: self.table_name = "friends"
app/models/tracetag.rb:20: self.table_name = "gpx_file_tags"
app/models/old_node_tag.rb:16: self.table_name = "node_tags"
```
We might also want to rename certain tables that don't currently have a model,
such as `changeset_subscribers` (to e.g. `changeset_subscriptions`) but I
haven't made a list of these.
Having these mismatched table/model names doesn't provide any benefits to
anyone, as far as I can tell. It also makes it harder for new developers to get
started, since they might look at the database structure (e.g. #5308) and then
get confused when they can't find the corresponding models. In particular, I
found it very confusing when I first started, since we have a table called
"nodes" and a "Node" model, but these do not correspond with each other!
So my proposal is to rename the tables to match the model names.
There is a zero-downtime approach to renaming tables in PostgreSQL, as
described at https://brandur.org/fragments/postgres-table-rename . In short, we
* Rename the table, and create a view with the old name, in a transaction.
* Update any code that accesses that table (e.g. rails, cgimap, replication
utilities) to use the new table name directly.
* Eventually, drop the view.
For a small number of renames, we will need to do this in multiple stages, due
to conflicts (e.g. `nodes -> old_nodes` then `current_nodes -> nodes` some time
later).
Before getting started on this, my main question is whether the OSMF operations
team (e.g. @tomhughes @Firefishy ) see any problem with this, for example, any
details about how the OSMF database replication works that would make this a
non-starter. Or if there's any reasons that I haven't considered why this might
not work.
--
Reply to this email directly or view it on GitHub:
https://github.com/openstreetmap/openstreetmap-website/issues/5619
You are receiving this because you are subscribed to this thread.
Message ID: <openstreetmap/openstreetmap-website/issues/5...@github.com>
_______________________________________________
rails-dev mailing list
rails-dev@openstreetmap.org
https://lists.openstreetmap.org/listinfo/rails-dev