如何拥有一个包含数千个表的数据库,这些表具有不同数量的列,这些列在 Django / SQLAlchemy ORM 中都是同一类?
Posted
技术标签:
【中文标题】如何拥有一个包含数千个表的数据库,这些表具有不同数量的列,这些列在 Django / SQLAlchemy ORM 中都是同一类?【英文标题】:How can I have a database with thousands of tables with varying number of columns that are all of the same class in Django / SQLAlchemy ORM? 【发布时间】:2020-07-21 10:05:23 【问题描述】:我拥有数千家不同公司的财务报表数据。有些公司只有 2019 年的数据,但有些公司有长达十年的数据。每个公司的财务报表都有自己的表格,其结构如下,其中的列以粗体显示:
lineitem---2019---2018---2017 2............1000....800......600 3206...........700....300....-200 56........50....100........100 200............1200......90......700
这种结构比 lineitem-year-amount 等平面文件结构更受欢迎,因为一个查询为我提供了财务报表表输出的正确结构。 lineitem 是一个外键,链接到具有超过 10,000 条记录的映射表的主键。例如,3206 可以表示“债转贷机构”。我还有一个 companyIndex 表,其中包含公司 ID、公司名称和表名。我能够将数据导入数据库并在 python 中使用 sqlite3 进行查询,但高级查询有时会有些挑战,更不用说它可能需要很多时间并且可读性不强。我喜欢在 Django 或 SQLAlchemy 中使用 ORM 的潜力。 SQLAlchemy 中的 ORM 似乎希望我知道要创建的表的名称,并希望我知道要创建多少列,但我不知道,因为我有一个脚本可以解析 csv 中的数据转储包括公司 ID 和运营年数的财务报表数据。此外,一年后,我将不得不用另外一年的数据更新表格。
我一直在观看和阅读 Django 和 SQLAlchemy 教程,但由于这个初始问题是我项目成功的先决条件,因此无法在实践中尝试太多。我用谷歌搜索和搜索,并检查了 *** 的解决方案,但没有找到任何已解决的问题(这真的很令人惊讶,因为我总是在这里找到解决方案)。
那么,鉴于我打算让它适合的结构,我如何使用 Django/SQLAlchemy 插入数据?如何让选定的表(基于公司 ID 或公司名称)成为 ORM 中的一个对象,就像任何其他允许我在我想要的粒度级别上选择我想要的数据的对象一样? 理想情况下,在 Django 中有一个解决方案,但由于我没有找到任何我怀疑没有的东西,或者我构建数据库的方式是疯狂的。
【问题讨论】:
...顺便说一句,欢迎来到 ***! 由于您是新来的,请花点时间阅读帮助中心,特别是 How do I ask a good question 和 How to create a MRE。考虑到该信息以解决未来的问题。我认为您的问题没有问题,但在阅读帮助后您会明白,按照规则,这有点边界。与规则风格截然不同的问题可能会被某些人否决。 我的意思是这里的大多数问题都显示了一个小代码 sn-p 您尝试过但无法正常工作,并寻求帮助以使其正常工作。没有比这更严重的了。 【参考方案1】:您找不到解决方案,因为没有。 您正在将输入数据格式与表架构混合。
您建立一个初始数据库表架构,然后将数据作为行添加到表中。 除非您决定必须更改架构以支持应用程序中的不同(通常是附加功能)功能,否则您永远不会再次接触数据库表列,因为例如,在应用程序生命周期的某个时刻,数据需要新属性。不是因为有更多数据,而是简单地转换为一个或多个表中的新数据行。
因此,首先您要根据将从某处读取或导入的数据记录来决定数据库表的适当架构。
然后你确保数据库被规范化直到第三范式。 你真的必须了解this。没读过,只是略读,但我认为它是正确的。这是您无法逃避的基本数据库知识。在正确地学习它并通过练习后,它会成为第二天性,您会在不知不觉中应用这些规则。
然后你的问题就会消失,你可以用任何你想使用的关系数据库或 ORM 做你想做的事。
唯一剩下的问题是输入数据需要验证,有时它没有以正确的形式提供给我们。因此,在将适当的数据行写入现有表之前,程序或初始导入过程或进一步的数据导入操作可能需要对数据进行一些处理。
【讨论】:
谢谢你,程序。为了满足第 3 范式的要求(包括不插入、删除、更新异常),我想我必须将我的公司表变成一个表 lineitem (foreignKey) - companyID (foreignKey) - type -year -金额(类型代表法定/合并,约 10% 两者兼有)。大约 100 万家公司,平均 10 年,平均线项目 50。1m x 10 x 50 x110% 等于 5.5 亿行。 (1)我不知道这是否可能,(2)如果可能的话,我假设性能也会很糟糕。您对如何处理有一些想法吗? 我其实已经买了一本关于数据库设计的书(Rod Stephens 的《Beginning Database Design Solutions》),所以我绝对明白理解这些概念是有一定意义的!我只需要继续阅读——我想我是在走路之前尝试跑步。任何关于阅读我的特定问题的想法将不胜感激! 拥有这本书看起来很适合您的需要。绝对阅读 p27,然后 ch3,然后在 ch5 中阅读 p106 到 p117 和 ch5 p113 到 p150,你应该正在走向一个好的表和关系模式。 不要假设没有实际经验的性能。数据库可能是您在处理数据记录时获得最佳性能的最佳工具。在您可以使用真实数据和真实数据量进行测试之前,请忘记性能问题。 索引和后来的优化可以创造奇迹,只是不要在其中存储 blob,如果需要存储这种东西,请存储文件名的路径。以上是关于如何拥有一个包含数千个表的数据库,这些表具有不同数量的列,这些列在 Django / SQLAlchemy ORM 中都是同一类?的主要内容,如果未能解决你的问题,请参考以下文章