Reputation: 2365
I have a few tables storing their corresponding records for my system. For example, there could be a table called templates
and logos
. But for each table, one of the rows will be a default in the system. I would have normally added a is_default
column for each table, but all of the rows except for 1 would have been 0
.
Another colleague of mine sees another route, in which there is a system_defaults
table. And that table has a column for each table. For example, this table would have a template_id
column and a logo_id
column. Then that column stores the corresponding default.
Is one way more correct than the other generally? The first way, there are many columns with the same value, except for 1. And the second, I suppose I just have to do a join to get the details, and the table grows sideways whenever I add a new table that has a default.
Upvotes: 0
Views: 219
Reputation: 1741
The solutions mainly differ in the ways to make sure that no more than one default value is assigned for each table.
is_default
solution: Here it may happen that more than one record of a table has the value 1. It depends on the SQL dialect of your database whether this can be excluded by a constraint. As far as I understand MySQL, this kind of constraint can't be expressed there.
Separate table solution: Here you can easily make sure by your table design that at most one default is present per table. By assigning not null
constraints, you can also force defaults for specific tables, or not. When you introduce a new table, you are extending your database (and the software working on it) anyway, so the additional attribute on the default
table won't hurt.
A middle course might be the following: Have a table
Defaults
id
table_name
row_id
with one record per table, identified by the table name. Technically, the problem of more than one default per table may also occur here. But if you only insert records into this table when a new table gets introduced, then your operative software will only need to perform updates on this table, never inserts. You can easily check this via code inspection.
Upvotes: 1