我们正在开发一个大型内部项目,使用户能够上传Excel文件,并最终对从这些Excel中收集的所有数据执行搜索。在开始设计之前,我正在尝试做功课,并提出最佳解决方案。
用户可以根据需要上传包含尽可能多列的Excel文件,以便没有预定义的excel结构。
与第一点相反,我们假设用户拥有一些字段。例如 - 名字,姓氏。这些列不一定存在。
关于 其他 搜索字段的另一个词 - 此字段将遍历所有不符合预定义列的Excel文件中的所有列。 I.E - 一个文件有一个年龄列,另一个文件有一个出生地列,“其他”字段将搜索所有这些列。
为上传的每个Excel动态创建一个新的django模型,其中包含excel的所有列?
为每个文件动态创建一个新的django模型,包含所有预定义的列(如果它们存在!),以及一个“其他”文本字段,它将连接所有不相关的字段?
有一个大的django模型(在我的数据库中只有1个表),它有我所有的预定义字段(也可以是null),还有一个名为“others”的字段,它将连接所有不相关的列
我的主表可以包含所有预定义列,另一个表包含主表的外键,其中每行代表一个“其他”字段。
第四种解决方案的例子 -
+----+--------+--------+--------+
| id | field1 | field2 | field3 |
+----+--------+--------+--------+
| 1 | val1 | val1 | val1 |
| 2 | val2 | val2 | val2 |
| 3 | val3 | val3 | val3 |
+----+--------+--------+--------+
维度表 -
+----+------+------+
| fk | key | val |
+----+------+------+
| 1 | key1 | val1 |
| 1 | key2 | val2 |
| 1 | key3 | val3 |
| 2 | key4 | val4 |
+----+------+------+
至于 Scaling - 我们预计最终不会有超过1500个excel文件,每个文件包含100到大约100个。 100,000行(我们可能会将每个excel文件的行数限制为100k)。我们从excels中得到的统计数据表明,我们不会超过3000万行。
我们将使用Django与 MySQL 或 PostgreSQL 。
我希望我的问题很明确,而且不太透明。
谢谢!
答案 0 :(得分:2)
编辑:你改变了你的问题。我在你的模型4上添加了一个简短的部分。
我强烈建议不要动态创建表格。这很麻烦,我怀疑它会表现良好。您的数据库将为您将查询的每个数据库表创建一个访问路径,因此如果您创建多个数据库文件,则需要搜索所有这些数据库。
您可能需要模型3的变体。
这意味着您使用一个表,但是为每个字段使用列,您可以为excel列名称创建两个列,为其创建一个列。您还需要一些其他条目来确定哪个Excel列和值属于哪个Excel电子表格。
从概念上讲,而不是建模:
field1 field2 field3 field4 other
------------------------------------
x y z a etc=xyz
你这样建模:
sheet fieldname value
------------------------------------
key field1 x
key field2 y
key field3 z
key field4 a
key etc xyz
此模型的优势在于您可以更轻松地对搜索进行编程。您可以将任何搜索建模为select * from data where fieldname='%s' and value='%s'
。如果在fieldname
上创建数据库索引(并且可能是用于标识excel表的key
上的索引),则对于模型3的原始概念应该没有性能损失。
您的模型4也可以使用。它的优点是,对于预定义字段,用户的查询语句可以轻松映射到SQL select语句。它的缺点是你需要处理你的"其他人"列与用户的其他搜索条件不同。您还指出用户有时不会输入您希望在那里的列。这意味着您必须使这些列可以为空,这会增加存储要求。
总的来说,我认为我建议的方法比选项4更好,因为它在概念上更简单。您表示您认为它会创建太多行。事实上,这将创建更多的行,但MySQL和PostgresSQL可以很容易地创建行数。 PostgresSQL可以存储无限数量的行。 MySQL可以存储4000到10000行(如果需要更多,你可以使用--big-tables编译MySQL)。
就性能而言,只要你在这个领域有一个索引,你的桌子有多大就没有什么区别。