在使用像 EF 这样的 ORM 时,是不是可以在运行时以编程方式创建新表?

Posted

技术标签:

【中文标题】在使用像 EF 这样的 ORM 时,是不是可以在运行时以编程方式创建新表?【英文标题】:Is it possible to programmatically create new tables at runtime while using ORM like EF?在使用像 EF 这样的 ORM 时,是否可以在运行时以编程方式创建新表? 【发布时间】:2022-01-12 20:40:08 【问题描述】:

在使用像 EF 这样的 ORM 时,是否可以在运行时以编程方式创建新表? 有没有简单或直观的方法来做到这一点?

例如,每次我的用户创建新产品设计时,都会在数据库中创建一个新表来存储该产品的序列号。

这里有一些上下文:

我正在开发一个应用程序来管理生产环境中的产品序列号。 某些特定设计的产品最终可能会以数百万件的规模生产,每件产品都必须有一个唯一的序列号。 不同设计的产品可能具有相同的序列号。 不同的产品设计有不同的序列号架构。有些是随机的,有些是顺序的。前任。 (AA00, AA01, AA02...ZZ99) 或 (IBW8395, YHM4892, UIO0385) 需要记录每个作业使用的序列号。它们必须是可搜索且可验证的唯一性。前任。我需要按序列查找退回的产品,并确定它来自哪个生产运行、生产时间等。

如果我想为架构为 AA00000 的产品创建随机序列,我必须生成所有可能性,然后将它们随机化并将它们放在一个表中。然后,当它们用于生产时,我会将它们从表中删除,因此它们可能永远不会再用于该设计。然后,我会将使用过的序列号放在一个单独的表中,以记录使用的序列号、日期以及其他有关制作的详细信息。对于具有示例串行模式的每个产品设计,将有 67,600,000 条记录,这些记录总计超过 500MB 的原始数据。所以在我看来,用一张表来存储所有产品的所有序列号似乎不是一个好主意。几年后,该表中可能会有数十亿条记录。

我已尝试寻找此类问题的解决方案,但没有找到合适的解决方案。也许我不知道有关此类问题的常见概念。我确信这是一种普遍的需求。

【问题讨论】:

修复您的数据库设计...而不是为每个产品创建一个新表,而是使用带有产品外键的单个序列号表。 同意。这只是损坏的设计 - 不要动态创建表来“分区”数据;只需使用单个表并按键列过滤。 如果您必须即时执行任何操作,请将其限制为透明地应用过滤器的视图 - 但我建议在您的代码(而不是您的数据库)中使用过滤存储库。 67,600,000 条记录和 500MB 对于架构合理的数据库来说听起来并不多。我同意 Dale 和 Franz 的观点;我认为你不需要这种能力。 @RobertHarvey:这是每个产品的编号。从长远来看,OP 担心最终会产生数十亿条记录。 是问题过滤还是问题表大小?因为如果表大小不是问题,过滤就不是问题。正确索引的外键在大表上和在小表上一样快。 【参考方案1】:

每次我的用户创建新产品设计时,都会在数据库中创建一个新表来存储该产品的序列号。

没有。将在 Product 表中插入一个新的 ,并在使用主键 (ProductId,SerialNumber) 在 ProductSerialNumber 表中创建序列号时插入它们。序列号可以由您想要的任何逻辑生成,并且每个 ProductId 都是唯一的。

如果我想为架构为 AA00000 的产品创建随机序列,我必须生成所有可能性,然后将它们随机化并放在一个表中。

或者您可以在运行时生成一个随机序列,如果它已经存在则重试。您不会期望在要生成的序列号数量中进行大量重试。我知道这样做的唯一原因是防止猜测或错误键入序列号以产生有效的序列号,因此您只想生成一小部分可能的值。

或者您可以使用 SEQUENCE 对象通过算术或单个映射表生成看起来随机的数字。

【讨论】:

碰撞率会远高于你的预期。模式 AA00000 产生 67,600,000 种可能性。对于最后一个产品,对未使用序列的每次猜测都有 6760 万次成功的机会。即使在运行的早期,生日问题也会导致严重的碰撞。 为了好玩,我完全在内存中实现了随机序列号方法。第一个百万是在 534 毫秒内找到的。第 36 组 100 万个唯一序列号耗时 16.5 秒。第 37 组 100 万现在已经运行了 4 分钟并且还在继续计数(所有 CPU 受限...大量可用内存且不涉及 IO)。 在这个领域中,“第一百万”可能是多余的。否则在序列号格式中添加一个零。 因为“产生所有可能性”的最佳情况表现很糟糕。 我讨厌必须预先生成所有可能的 GUID。要是有更好的办法就好了……

以上是关于在使用像 EF 这样的 ORM 时,是不是可以在运行时以编程方式创建新表?的主要内容,如果未能解决你的问题,请参考以下文章

当有许多关联时使用像 NHibernate 这样的 ORM - 性能问题

像.net Entity Framework 这样的 Node JS 的 ORM?

EF通用数据层封装类(支持读写分离,一主多从)

EF通用数据层封装类(支持读写分离,一主多从)

EF通用数据层封装类(支持读写分离,一主多从)

仅用于存储过程的 ORM:首选工具