我有一种情况,我不知道如何处理。首先我要说的是,我主要是一名软件程序员,对数据库和设计相当熟悉,但我不是专家。我目前的任务是构建一个系统,该系统将调用各种社交媒体API,并为各种平台上的许多帐户下载数据。我使用实体框架构建了C#应用程序来调用API,将结果转换为实体,并将它们插入到数据库中。
我设计了一个数据库,它遵循返回给我的API对象的结构,其结构并不重要,除了知道我在适当的时候使用外键构建一个相当规范化的数据库。
考虑Twitter的例子,我们有
TABLE [User]
(
UserID INT PK NOT NULL,
--etc
)
和
TABLE [Tweet]
(
TweetID INT PK NOT NULL,
TweetingUserID INT FOREIGN KEY REFERENCES User(UserID),
--etc
)
我们看到的问题已经出现了,我认为主要是因为我们的API应用程序仍处于“沙盒模式”,而且我们没有从API调用中获取完整的数据集,也就是说,我们可能会得到前10位用户在询问“粉丝”时,无论跟随我的总人数如何,但在询问时间线推文时,我会收回前20条推文,无论是谁发布。
所以,当我尝试插入我给出的所有推文时,在插入所有返回的用户之后,有些时候,我会收到一条推文,由一个从未从API调用返回的用户创建。 Tweet端存在用户ID,但用户PK中不存在该ID。这会导致PK违规错误,并且将抛出整个保存操作(给定帐户的所有实体)。
处理这种情况的正确方法是什么?正如我所见,我的选择是
A:扫描本地dbSet&我下载的每个实体的数据库都有一个FK来检查并确保在尝试设置FK属性之前存在引用的实体,并在PK端将其设置为null或伪造的“缺失实体”记录。这似乎效率很低,并且需要为每个API调用类型编写更多代码。
B:从数据库中删除所有FK,这样就不会有任何违反。将它留给dba只是使用外连接,并在聚合/仓库数据时检测何时缺少连接ID。从数据库设计的角度来看,这似乎是错误的,并且还会破坏EF模型中的所有参考属性。
是否有一些我不知道的技术可以解决这个问题?由于我获得的数据质量,我的手是否只是依赖于使用FK?我错过了一些明显的东西吗?
谢谢!