【问题标题】:Efficient ways to store multiple excel files in a database?在数据库中存储多个excel文件的有效方法?
【发布时间】:2014-07-06 01:30:14
【问题描述】:

我们正在开发一个大型内部项目,该项目使用户能够上传 Excel 文件,并最终对从这些 Excel 中收集的所有数据执行搜索。在开始设计之前,我正在尝试做功课,并提出最佳解决方案。

要求是 -

  1. 用户可以上传包含任意多列的 excel 文件,因此 excel 没有预定义的结构

  2. 与第一点相反,我们假设用户拥有一些字段。例如 - 名字,姓氏。这些列不一定存在。

  3. 搜索选项将按以下方式工作 - 当用户搜索时,他可以按特定列进行搜索 - 那些是预定义的并且我们希望他的 excel 文件具有。 (在我们的示例中 - 名字和姓氏)。 他还可以在“其他”字段下搜索所有其他列。

关于 Other 搜索字段的另一个词 - 该字段将遍历所有不适合预定义列的 Excel 文件中的所有列。 IE - 一个文件有一个年龄列,另一个有一个出生地列,“其他”字段将搜索所有这些列。


最好的方法是什么?

  1. 为每个上传的 excel 动态创建一个新的 django 模型,包含 excel 的所有列?

  2. 为每个文件动态创建一个新的 django 模型,其中包含所有预定义的列(如果存在!)和一个“其他”文本字段,它将连接所有不相关的字段?

  3. 有一个大的 django 模型(意味着我的数据库中只有 1 个表),其中包含我所有的预定义字段(同样可以为空),还有一个名为“其他”的字段,它将连接所有不相关的列?

  4. 我可以拥有包含所有预定义列的主表,以及具有主表外键的另一个表,其中每一行代表一个“其他”字段。

第四个解决方案的示例 -

+----+--------+--------+--------+
| 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 |
+----+------+------+



至于 缩放 - 我们预计最终不会超过 1500 个 excel 文件,每个文件包含 100 到大约 100 个。 100,000 行(我们可能会将每个 excel 文件的行数限制为 100k)。我们从 excel 中得到的统计数据表明,我们不会超过 30~ 百万行。

我们将在 MySQLPostgreSQL 中使用 Django。

我希望我的问题是明确的,而不是太不透明。

谢谢!

【问题讨论】:

    标签: python mysql django excel postgresql


    【解决方案1】:

    编辑:更改问题后。我在您的模型 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 上创建数据库索引(并且可能在 key 上创建用于识别 excel 工作表的索引),那么模型 3 的原始想法应该没有性能损失。

    您的模型 4 也可以。它的优点是,对于预定义字段,您的用户查询语句可以轻松映射到 SQL 选择语句。它的缺点是您需要以不同于其他用户搜索条件的方式处理“其他”列。您还指出,用户有时不会输入您希望出现的列。这意味着您必须使这些列可以为空,这会增加存储要求。

    总的来说,我认为我建议的方法比您的选项 4 更好,因为它在概念上更简单。您表示您认为它会创建太多行。事实上,这会创建更多的行,但 MySQL 和 PostgresSQL 可以轻松地创建这么多的行。 PostgresSQL 可以存储无限数量的行。 MySQL 可以存储 4000~ 百万行(如果需要更多,可以使用 --big-tables 编译 MySQL)。

    就性能而言,只要您在字段上有索引,您的表有多大并没有真正的区别。

    【讨论】:

    • 这是个好主意,但我最终得到了这么多行...如果我们最终得到 3000 万条记录,将其乘以列数,你会得到一个荒谬的记录数量。我们有近 10 列是预期的,即使没有 excel 可能有的随机列!我只是想拥有 2 个表 - 一个用于主数据,每行代表一个带有预期列的 excel 行,另一个表具有主表的外键,其中每条记录是其他值的附加列.那个怎么样?查询会有效吗?
    • 3亿条记录可以在sqlite中轻松处理。如果您使用索引,行数不会成为问题。如果您担心存储大小,可以通过创建一个表将字段名称映射到键并将该键存储在主表中(而不是字段名称)来减少它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2014-02-18
    • 2010-09-22
    相关资源
    最近更新 更多