【问题标题】:split table rows of data into multiple tables according to column obeying constraints根据列服从约束将表中的数据行拆分为多个表
【发布时间】:2020-08-19 18:41:56
【问题描述】:

我有一个包含大约 20 列数据和大约 11K 记录的源平面文件。每条记录(行)包含诸如

之类的信息

patientID、PatietnSSN.PatientDOB、PatientSex、PatientName、Patientaddress、PatientPhone、PatientWorkPhone、PatientProvider、PatientReferrer、PatientPrimaryInsurance、PatientInsurancePolicyID。

我的目标是将这些数据移动到 sql 数据库中。

我已经使用以下数据模型创建了一个数据库

我知道要进行批量插入以移动所有记录,但是我不确定如何执行此操作,因为您可以看到存在并且必须限制以确保引用完整性。我的方法应该是什么?我做错了吗?到目前为止,我已经使用 SSIS 将数据导入到单个临时表中,现在我必须弄清楚如何将 11k 多条记录写入它们所属的各个表中......所以临时表的记录 1 将创建 1 条记录在几乎所有表格中减去可能存在一对多关系的表格,例如“提供者”和“推荐人”,因为一个提供者将与许多患者相关联,但一名患者只能有一个提供者。

我希望我已经解释得足够好。请帮忙!

【问题讨论】:

  • 考虑查看 SQLServer 中的存储过程/函数支持。您也许可以编写一些程序,例如插入一条主记录,返回 id,然后插入引用该返回 ID 的相关记录。
  • 除非你真的需要它,否则我会删除 appt/providers 引用——循环依赖会给你带来额外的工作。另外,您将使用什么工具来更新数据库?原始 SQL 还是编程语言?如果建模正确,许多 ORM 会为您解决这个问题。如果有人要求我这样做,我会用 Python 编写脚本,或者使用诸如 expressor 之类的 ETL 工具。
  • @ed Orsi 不会像 SSIS 包那样违反约束,因为它不会按任何特定顺序进行插入,所以我无法控制第一秒写入的记录等等...... ?
  • @SteveJ 在我们发言时,我正在研究您对 ORM 的建议……我完全是关于对我有用的工具! :-)
  • @JoseFreyre;如果你没有最喜欢的语言,我认为 Python 和 Pony-Orm 可能会做到。带有实体框架的 C# 也可以——但学习曲线很长。

标签: sql-server ssis foreign-keys data-modeling referential-integrity


【解决方案1】:

由于问题是通用的,我也会以通用的方式来回答 - 至少让您提出正确的问题。

您的目标是将平面文件数据导入关系数据库。这是一个非常常见的操作,并且至少是 ETL 过程的一个子集。因此,您可能希望通过阅读有关 ETL 的更多信息来开始搜索。

在我看来,您的根本问题有两个方面。首先,您需要插入大量数据。其次,您要插入到关系数据库中。

先从第二个问题开始;并非每次都可以插入所有数据。例如,您有一个提供者表,其中包含与患者的 1:many 关系。这意味着您必须询问平面表中每个患者行的问题,即提供者是否存在或需要创建。此外,您已经播种了 Id,这意味着在某些情况下,您必须维护创建顺序,以便您可以在下一个创建的条目中引用已创建条目的 id。这对您意味着您的工作将比一组简单的 SQL 插入更复杂。您需要与工作相关的逻辑。有几种方法可以解决这个问题。

  • 纯 SQL/TSQL;可以完成,但需要大量工作且难以调试/故障排除
  • 编写程序:这为您提供了很大的灵活性,但意味着您必须知道如何编程和使用编程工具来处理数据库(例如 ORM)
  • 使用自动化 ETL 工具
  • 使用 SQL Server 的平面文件导入功能
  • 使用具有导入功能的 IDE - 例如 Toad、Datagrip、DBeaver 等。

这些方法中的每一种都需要您进行一些研究和学习——本论坛无法教您如何使用它们。您要使用哪一个的决定在一定程度上取决于该过程的自动化程度。

关于您的第一个问题——大数据插入。 SQL 具有批量插入功能docs,但您必须先调整数据。

就个人而言(根据我的 cmets),我是一名 .Net 开发人员。但是考虑到这个任务,我仍然会用 Python 编写脚本。 Python 的学习曲线非常好,它有很多很棒的工具来处理文件和数据库。 .Net 和 EF 带来了很多开销,因为您需要了解 Python 不具备的入门知识 - 但这只是我。

希望这有助于您入门。

【讨论】:

    【解决方案2】:

    史蒂夫,你是老板,谢谢。 Ed 也谢谢你!

    我已经考虑了每个人的指导,并得出结论,我无法通过简单的解决方案来解决这个问题。

    有更大的影响,所以以这样一种方式完成这项基础工作任务是有意义的,这样我就可以利用我的努力为未来的项目做准备。我将继续使用 EF 处理一个简单的 .net Web 应用程序来处理数据模型并编写一个简单的导入过程来提取数据。

    我有一个想法,我将如何做到这一点,但在这个董事会的帮助下,我确信成功会随之而来!谢谢大家-乔伊

    对于我计划使用的记录工具(我同意复杂性和学习曲线的意见,但对 MS 产品有亲和力)。

    1. Azure SQL 数据库(数据存储)
    2. Visual Studio 2017 CE(IDE)
    3. C#(语言)
    4. .net MVC(项目类型)
    5. EF 6 (orm)
    6. 格蕾丝(因为我只是人类:-)

    【讨论】:

      猜你喜欢
      • 2013-08-04
      • 2022-12-22
      • 2020-04-23
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      相关资源
      最近更新 更多