【问题标题】:avoid duplication of table避免重复表
【发布时间】:2011-07-14 03:49:38
【问题描述】:

我有一个表格,其中包含有关 Id、Name、Date、WorkerId、VehicleId(以及更多 50 个字段)等任务的数据。

我想构建一个订单模块,允许用户将任务作为订单插入。 订单包含来自任务的子字段,例如仅 WorkerId 和 VehicleId(正如我所说 - 任务表中有 50 多个字段)。 由于每个用户都可以选择组成订单的字段定义 - 我必须复制任务表并将其命名为订单表。 由于任务表的巨大尺寸(就字段而言),我想避免重复它。是否有任何可能的方法来存储不包括创建大表(如任务表)的订单数据?

附:我不想将订单存储在任务表中,因为: 1.会有很多订单可能会影响性能。 2. 已经有很多很多任务了。

【问题讨论】:

    标签: sql-server tsql database-design schema


    【解决方案1】:

    您可以将字段is_order 添加到您的任务表中,如果它是订单,则将其设置为 true,如果它是任务,则将其设置为 false。

    您可能还想重命名您的表以显示它可以包含订单或任务。

    【讨论】:

    • 我更新了我的问题 - 我不想合并任务和订单。
    • 我有很多不去做的理由,我可以写很多故事,浪费很多时间。我不想和桌子一起 - 请尝试帮助我解决我的限制。
    【解决方案2】:

    如果我理解正确,您想创建一个新表,但不希望它有 50 多列。对吗?

    您可以执行Orders(ID, Configuration) 之类的操作,其中 Configuration 是所有可选数据的某种字符串表示形式。或者你可以做类似Orders(ID, FieldID, FieldValue) 的事情。在这种情况下,如果一个订单有三个可选字段,它将在表格中显示为 3 个不同的行。当您想要查询它们时,这两种方法都会带来挑战。我想我会咬紧牙关,只拥有 50 列的表。

    【讨论】:

    • 请参阅我添加到 Catcall 答案中的评论,该评论与您的​​类似。
    • 如果 FK 很重要,那么我认为您更需要 50 列的表。
    【解决方案3】:

    如果您在 Task 中有 50 个字段,则该表未标准化。如果它是“非常重复的系统”,则数据库未标准化。您似乎知道,未规范化的表很难扩展,它们对功能扩展施加了严格的限制。

    在添加 Order 并将它们与 Task 或 Task 的组件相关联,从而使重复变得复杂之前,您需要先对 Task 进行规范化。这将产生多个与 Task 相关的规范化表(Person、Vehicle、Worker),然后添加 Order 并将 Order 与这些表相关联将很简单。

    【讨论】:

    • 我的表已规范化,我已经有 Workers、Vehicles 等表。
    • @Naor。这太棒了。在这种情况下,发布与任务相关的所有表的 DDL(包括索引)。我们可以将 Order 关联到适当的表,而不是 Task。
    【解决方案4】:

    从您的描述中很难确定,但听起来您想将“任务”表中的列视为订单的行项目。

    ord_num  line_item    task_attribute    attribute_value
    --
    15       1            WorkerId          35
    15       2            VehicleId         101-345-2A3574
    

    话虽如此,但我不得不说

    • 让用户 订购任务,但
    • 我觉得让 用户从 任务表。

    尤其是从任务表中订购一个或两个 id 号码——WTF 是不是 意味着,无论如何?

    【讨论】:

    • 这是一个非常重复的系统,有很多连接,我试图让事情变得非常简单,所以听起来不合逻辑。但相信我——确实如此。您的解决方案的问题是我不能使用外键,我认为这是一个巨大的减号。
    • @Naor:如果必须为“tasks”表设置外键,就不能让用户选择列,可以吗?外键必须引用主键或具有唯一约束的列或列集。
    猜你喜欢
    • 1970-01-01
    • 2017-02-05
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2015-08-09
    相关资源
    最近更新 更多