0

请帮助我找到一个数据库表的正确结构,该结构允许存储如下所示的 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 表中为每一列设置 1 行

那么这是正确的方法吗?

4

1 回答 1

2

数据库表定义声明其列,而不是行。根据您正在建模的内容以及您将如何使用此表,我会建议其中一种方法。

一个规范化的方法是这样的:

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_labelvalue_label,因此它将毫不费力地处理任意数量的value_labels每个实体(Excel“col_nn”)和整体数据点。将所有内容相加是一件简单的事情column_valuesentity_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),您可能会发现自己编辑大量代码只是为了考虑实体的新列。

我喜欢重复的一句口头禅是“行很便宜,列很贵”。在设计数据库表时请记住这一点。

于 2012-08-09T23:29:49.730 回答