2012-10-29 118 views
1

如果我错误地使用了“数据模式”,我表示歉意。这里有一些背景。我将Access数据库移植到基于Web的MYSQL应用程序。以下是我们正在追踪的内容。针对多列相同数据模式的数据库设计

我们有一台最多16个机头的机器。每个头都有三个与其相关的项目,其中两个是整数,一个是短文本字符串。每个生产订单至少使用一个头。有些使用全部16个,有些仅使用一个。如果使用多个头,我们会跟踪它们的使用顺序。每个生产订单都有几个短到中等长度的字段,另外还存储这些字段。绝大多数生产运行使用不到给定头的一半。

当前数据位于Access数据库中,该数据库将所有内容存储在一个表中,因此每行存储6 +(16 * 3)48个字段,总共包含54列。唯一的搜索字段是第二个,它们是整数。

id|workorder|partnumber|note|machine|reference|head1spec1|head1spec2|head1spec3|head2spec1|head2spec2|head2spec3| ...等,以头16

我知道有很多的死亡空间在那里,因为每一行包含16种元素,可以被分解成一个单独的表,并加入了显示效果。它已经获得了大约10年的数据,现在Access数据库的文件大小为60.8 MB

这是我的问题。在这种情况下,是否有任何真正的世界优势来规范化(可能不正确的用法),因为没有这些数据用于搜索,并且将它全部放在一列中对于该​​信息来说是一种自然状态?

+0

如果花费10年时间才能达到60mb,那么为了节省空间,我并不担心优化。在100年内它仍然适合5美元的USB驱动器。 – bumperbox

+0

每个头的三个属性是不变的? (它们只取决于head_number吗?),还是可以根据per_order的不同而变化? – wildplasser

+0

您的意思是“全部在一张桌子上”吗? –

回答

1

是的,有真实世界的优点,但我认为它们不足以保证修改现有的Access架构。相反,如果可能的话,我会把精力转移到一个更好的平台上,例如,基于Web的SQL Server后端。在进行迁移时您可以担心模式。

归一化的架构将帮助之类的东西:

  • 数据完整性:保证同一头或头规格不是同一台机器上使用了两次(除非是有效的,当然...)
  • 查询:很容易计算什么是最常用的headpec

你可以用你现在的模式来做这些事情,它只需要更多的工作。但是,这种模式已经运行了10年,那么变化的商业案例是什么?

+0

基于网络的MYSQL就是它的主角。当前的结构类型自己照顾你的第一个重点。确切的头并不重要,只有他们被使用的顺序。你必须有意无意地输入它们,或者不小心跳过一个来搞砸它。至于第二个要点,我想不出哪一个知道的东西是有用的。永远不要说永远。感谢您的答复。 –

1

我知道有很多的死亡空间在那里,...

不是真的。我并不了解Access如何实现它,但大多数数据库在存储NULL(通常是一个字节,但可能低至一位,如MS SQL Server的情况下)中相当有效。

...因为每行包含16个元素,可以将其分解为一个单独的表格并加入以显示结果。它已经获取的数据了约10年,现在的Access数据库文件的大小为60.8 MB

你没有说有多少行了这10多年积累,但60.8 MB是数据库方面花生,即使对于“轻量级”数据库(如Access)也是如此。

空间不是你的问题,因为整个数据库很容易适应当今硬件的内存(甚至10年前的硬件),速度也可能不是你的问题。

这是我的问题。在这种情况下,是否有任何真正的世界优势来规范化(可能不正确的用法),因为没有这些数据用于搜索,并且将它全部放在一列中对于该​​信息来说是一种自然状态?

优势(分裂从事1的两个表:N的关系)是更好的灵活性的情况下,你需要支持不同的机器有不同数量的头。此外,编写查询搜索,汇总或平均数据在所有头可能会更简单。

缺点是需要更多空间(因为子表需要存储来自父表的PK值的副本)并且更需要JOINing。

总而言之,您现有的设计对我来说看起来很好。你有没有在你的问题中提到你想要解决的具体问题?

+0

没有具体的问题,只是试图找出最好的行动方案,因为web/mysql转换可能会在未来十年保持原样。到目前为止,大约有65k行。每行支持具有不同头数的不同机器,我们只是不填充未使用的头。主要目的是跟踪序列顺序以在任何机器上重新创建作业。我想看看是否有任何真正的好处将数据分成两个表。这似乎是一个罕见的情况,最好的做法是单独留下足够的。除此之外:来自Access的原始数据转换为csv小于15MB! –

+0

@RandyKilwag _“来自Access的原始数据转换为csv小于15MB!”_如果与60.8 MB的差异归因于NULL,我会感到惊讶 - 更可能的原因仅仅是数据库结构(如索引和碎片)的开销。你有没有试过[压缩](http://stackoverflow.com/a/74537/533120)你的数据库?另外,你使用固定宽度类型(即CHAR vs VARCHAR)吗?一些数据库以固定宽度类型低效地存储NULL ... –