将补充数据与导入数据一起存储的策略

时间:2010-01-21 20:37:49

标签: sql sql-server database database-design

我曾经遇到过这个问题几次,我想知道其他人在做什么。

当我创建数据库时,有时我必须定期将数据导入表中,让我们说每天。我通常做的是删除所有记录并重新导入外部数据源中的每条记录。

我需要多次存储与导入记录相关的更多数据,但不是来自原始导入源。通常,这种“额外数据”来自用户输入。因此,我将创建另一个表,其主键与获取导入数据的表的键匹配,并将此附加数据存储在新表中。如果这没有意义,这是一个例子:

在旧的遗留系统中,我们存储员工数据。但是,我需要在无法连接到旧旧系统的Web应用程序中使用此数据。因此,我创建了一个数据库,其中的表格与旧系统中的数据模式相匹配,我每天都会将每条记录导入到此表中。当我进行导入时,我会丢弃每条记录并导入每条记录。

但在我的新系统中,员工可以保存生物。所以在另一个表中,我存储了这个和他们的Id。

只有一个表会更简单,但我不能这样做,因为我会删除导入时其他地方不存在的数据。

另一个坏处是,因为我要删除导入的所有这些记录,所以我无法使用相关数据定义外键约束。

我讨厌以这种方式设计数据库,因为我知道有更好的方法。如果我可以在导入数据时进行更新而不是删除并全部导入数据,那会不会很好?

我正在使用Sql server 2008,但我很想知道可以使用任何RDBMS的策略。

2 个答案:

答案 0 :(得分:2)

好吧,当你进行导入时,导入临时表,然后更新生产表中的记录(更新一般意义上的单词:删除已删除的内容,添加新内容,修改更改内容)。 / p>

您可能还想在2008年查看新的MERGE SQL命令,它可能对这种情况非常有帮助。

答案 1 :(得分:0)

这是我提出的SQL Server 2008合并声明,以帮助我了解当前的情况:

MERGE INTO dbo.Sections as S        -- Target
USING dbo.SectionsStaging as SS     -- Source
ON S.Id = SS.Id                     -- Join
WHEN MATCHED THEN                   -- Record exists in both tables
    UPDATE SET
        TermCode = SS.TermCode,
        CourseTitle = SS.CourseTitle,
        CoursePrefix = SS.CoursePrefix,
        CourseNumber = SS.CourseNumber,
        SectionNumber = SS.SectionNumber,
        Capacity = SS.Capacity,
        Campus = SS.Campus,
        FacultyFirstName = SS.FacultyFirstName,
        FacultyLastName = SS.FacultyLastName,
        [Status] = SS.[Status],
        Enrollment = SS.Enrollment
WHEN NOT MATCHED THEN               -- Record exists only in source table
    INSERT ([Id],[TermCode],[CourseTitle],[CoursePrefix],[CourseNumber],[SectionNumber],[Capacity],[Campus],[FacultyFirstName],[FacultyLastName],[Status],[Enrollment])
    VALUES (SS.[Id],SS.[TermCode],SS.[CourseTitle],SS.[CoursePrefix],SS.[CourseNumber],SS.[SectionNumber],SS.[Capacity],SS.[Campus],SS.[FacultyFirstName],SS.[FacultyLastName],SS.[Status],SS.[Enrollment])
WHEN NOT MATCHED BY SOURCE THEN     -- Record exists only in target table
    DELETE;

好东西!