2011-03-12 119 views
0

我有关于像Id,Name,Date,WorkerId,VehicleId(以及更多50个字段)任务的数据表。避免表格的重复

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

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

回答

0

从描述中很难确定,但听起来好像您想将表“任务”中的列作为订单的订单项对待。

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

话虽如此,但是,我不得不说,

  • 这个概念的意思给我,让用户 优先任务,但
  • 它没有任何意义,我让 用户订购 任务表中的一列或两列。

特别是对于只是为了一个或两个ID号从任务表 - 跆拳道这是否意味着啊?

+0

这是一个非常重复的系统,有很多连接,我试图让事情变得非常简单,所以它听起来像是不合逻辑的。但相信我 - 是的。你的解决方案的问题是我不能使用外键,我认为这是一个巨大的负面影响。 – Naor 2011-03-12 19:05:37

+0

@Naor:如果您必须将外键设置为“任务”表,您不能让用户选择列,可以吗?外键必须引用具有唯一约束的主键或列或一组列。 – 2011-03-12 19:21:00

1

您可以将字段is_order添加到您的任务表中,并将其设置为true(如果它的顺序)或false(如果它的任务)。

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

+0

我更新了我的问题 - 我不想合并任务和订单。 – Naor 2011-03-12 18:33:19

+0

@Naor:为了提高性能,你可以添加一个索引。 – 2011-03-12 18:39:58

+0

我有很多原因为什么不这样做,我可以写很多故事,浪费很多时间。我不想登上桌子 - 请尽量帮我解决我的限制。 – Naor 2011-03-12 19:02:37

1

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

你可以做一些像Orders(ID, Configuration)其中配置是所有可选数据的字符串表示。或者你可以做一些像Orders(ID, FieldID, FieldValue)。在这种情况下,如果订单有三个可选字段,它将在表中显示为3个不同的行。当你想查询它们时,这两种方法都会带来挑战。我想我会咬紧牙关,只有50列的桌子。

+0

请参阅我给Catcall的回答添加的评论,与您的回复类似。 – Naor 2011-03-12 19:06:34

+0

如果FK很重要,那么我认为你需要更多的50列表。 – joelt 2011-03-12 20:11:11

1

如果您在任务中有50个字段,那么这个表是未标准化的。如果它是“非常重复的系统”,则数据库不是标准化的。正如您似乎意识到的那样,非标准化表格很难扩展,它们对功能扩展设置了严格的限制。

在添加订单并将它们与任务或任务组件关联起来,从而复制重复之前,您需要先对任务进行标准化。这将导致任务涉及到的几个规范化表(Person,Vehicle,Worker),然后添加Order并将Order与这些表关联起来会很简单。

+0

我的桌子已经正常化了,我已经有工人,车辆等等桌子了。 – Naor 2011-03-13 09:28:41

+1

@Naor。太棒了。在这种情况下,发布与任务相关的所有表的DDL(包括索引)。我们可以将Order与适当的表相关联,而不是Task。 – PerformanceDBA 2011-03-13 10:56:01