数据库表定义声明其列,而不是行。根据您正在建模的内容以及您将如何使用此表,我会建议其中一种方法。
一个规范化的方法是这样的:
mytable(unique_id, entity_label, value_label, column_value, [other entity attributes e.g. date_added])
一些解码:entity_label
是您在 Excel 列 A 中的内容,value_label
是您在 Excel 行 1 中的内容。以这种方式存储的数据将如下所示:
unique_id entity_label value_label column_value
1 row_1 col_1 9
2 row_1 col_2 19
3 row_1 col_3 29
4 row_2 col_1 50
等等。
这为每个数据库行存储一个且仅一个值 ( column_value
),是一种灵活且可扩展的方法。例如,由于在每个数据库行上都标识了entity_label
和value_label
,因此它将毫不费力地处理任意数量的value_labels
每个实体(Excel“col_nn”)和整体数据点。将所有内容相加是一件简单的事情column_values
(entity_label
就像您在 Excel 列 E 中所做的那样)。删除、添加和更新实体或实体中的特定值都是可能且简单的。
另一方面,您的实体模型可能总是每个实体具有三个值。就像您提供了源数据一样,模仿这种方法的表定义可能是这样的:
mytable(unique_id, entity_label, column_value_1, column_value_2, column_value_3, [other entity attributes e.g. date_added])
这种方法的主要缺点是缺乏灵活性。例如,如果value_labels
每个实体的数量发生变化(例如,从 3 增加到 4),您可能会发现自己编辑大量代码只是为了考虑实体的新列。
我喜欢重复的一句口头禅是“行很便宜,列很贵”。在设计数据库表时请记住这一点。