请帮我查找数据库表的正确结构,以便存储excel表的数据,如下所示:
首先我尝试在表格中存储行和列标题:
rows(id_row, label)
columns(id_col, label)
然后我创建了一个用于存储这样的值的表:
mytable(id_tbl, #id_row, #id_col, value, date_add)
但我意识到这个解决方案需要更多的处理来选择和操作(删除,编辑),这可能会影响我的代码的性能
因为我有一个固定的行,所以我决定这样做:
columns(id_col,label)
mytable(id_tbl, id_col, date_add, row_1, row_2, row_3)
所以为了存储我的excel表的实例,我需要在mytable表中为每一列提供一行
这是正确的方法吗?
答案 0 :(得分:2)
数据库表定义声明其列,而不是行。根据您的建模内容以及您将如何使用此表,我建议使用其中一种方法。
一个好的normalized方法就是这样的:
mytable(unique_id, entity_label, value_label, column_value, [other entity attributes e.g. date_added])
一些解码:entity_label
就是您在Excel A列中所拥有的,value_label
就是您在Excel Row 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
,因此它可以毫不费力地处理每个实体{Excel 1}的任意数量value_labels
和整个数据点。对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),您可能会发现自己编辑了大量代码,只是为了考虑实体的新列。
我想重复一句咒语:“行很便宜,列很贵”。在设计数据库表时请记住这一点。