【问题标题】:Unique constraint on more than 10 columns超过 10 列的唯一约束
【发布时间】:2010-06-09 09:53:41
【问题描述】:

我有一个时间序列模拟模型,它有超过 10 个输入变量。不同模拟实例的数量将超过 100 万个,每个模拟实例每天都会生成几行输出。

为了将模拟结果保存在关系数据库中,我设计了这样的表格。

创建表 SimulationModel (

simul_id 整数主键,

input0 字符串/数字,

input1 字符串/数字,

...)

创建表 SimulationOutput (

dt 日期时间主键,

simul_id 整数主键,

输出0数字,

...)

为了使每个模型都独一无二,我正在考虑以下一些方法。

  1. 对 SimulationModel 表的所有输入列设置唯一约束

  2. 重新设计 SimulationModel 表,将输入列分组为 2~3 列,并对这些分组列设置唯一约束。 (通过制作像“input0_input1_input2”这样的长字符串值)

  3. 忘记服务器端的限制,在应用程序端完成工作。

您如何看待这些选项?

对10多列数百万行使用唯一索引没有问题吗?

还有其他方法推荐吗?

(我可能会使用 postgresql)

【问题讨论】:

    标签: database database-design unique-constraint


    【解决方案1】:

    创建 unqiue 约束。有几百万行的 10 列并不是一个真正的大表。此外,您的测试可能会受益于使用索引 - 或者至少索引不会造成任何伤害。

    【讨论】:

      【解决方案2】:

      如果您像这样为您的仿真模型创建两个表:

      Table SimulationModel {
      id: integer,
      ...
      }
      
      Table SimulationModelInput {
      simulationmodel_id: integer foreign key(SimulationModel.id),
      input: string or numeric,
      ...
      }
      

      然后您可以在 (simulationmodel_id, input) 上放置一个约束,但获取配置的查询更复杂。

      【讨论】:

      • 两个表将通过 simul_id 连接。我的问题是如何使所有输入变量的组合独一无二。
      • 所以每一个仿真模型都会与其他的不同?我认为简单的方法是在您的应用程序中执行此操作,因为如果您需要添加另一个输入,则必须重新创建数据库约束
      【解决方案3】:

      唯一索引是确保每组输入都是唯一的方法。

      【讨论】:

        【解决方案4】:

        您可以创建一个“唯一”列,它是其他列的散列,并将其称为标识。

        【讨论】:

          【解决方案5】:

          我会处理应用程序中的唯一性约束,特别是如果只有一个进程正在创建模拟。然后,您可以在通常过滤的输入列上拥有一个或多个非唯一索引,以实现高效访问。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-08-10
            • 2010-10-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-22
            • 1970-01-01
            相关资源
            最近更新 更多