建模excel表(动态列和固定行)

时间:2012-08-09 10:53:01

标签: database excel database-design

请帮我查找数据库表的正确结构,以便存储excel表的数据,如下所示:

enter image description here

首先我尝试在表格中存储行和列标题:

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表中为每一列提供一行

这是正确的方法吗?

1 个答案:

答案 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_labelvalue_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),您可能会发现自己编辑了大量代码,只是为了考虑实体的新列。

我想重复一句咒语:“行很便宜,列很贵”。在设计数据库表时请记住这一点。