【问题标题】:No duplicate rows, but redundant data没有重复的行,但有冗余数据
【发布时间】:2010-07-26 14:43:48
【问题描述】:

我有一个代表公司产品的 mySQL 表。该表显示两种产品是否相互兼容。

桌子有点像

Product1    Product2    Compatible?
A           A           Yes
A           B           ?
A           C           No
A           D           ?
B           A           ?
B           B           Yes
B           C           ?
B           D           Maybe
C           A           No
C           B           ?
C           C           Yes
C           D           ?
D           A           ?
D           B           Maybe
D           C           ?
D           D           Yes

请注意,虽然没有任何行是重复的,但有些数据是多余的。如果 A 与 C 不兼容,那么 C 显然与 A 不兼容。这使得一行冗余。我有这些行开始的原因是我使用嵌套的 for 循环构建了表。为了节省空间,您是否建议删除具有重复含义的行?还是将它们留在那里以便(可能?)维护?

【问题讨论】:

    标签: mysql database performance optimization


    【解决方案1】:

    空间很便宜……当今世界没有必要删除数据。但是,这并不意味着我们不能高效。如果我是作为数据库设计问题来解决这个问题的,那么我会创建两个表。

    产品一个

    一个兼容性,你已经做到了。

    但在上面的示例中,您没有说明跟踪不兼容性的原因。如果产品在兼容性表中,则意味着它们是兼容的……如果它们不是很好,则意味着它们不兼容。

    你是如何填充这些行的...你从来没有说明为什么要为 A 添加一行到 C 中,但是你还为 C 添加了一行到 A。为什么要添加第二行?

    在您的表格中,产品 A 和 B 的表格列中的确切数据是什么?产品编号?产品名称?

    【讨论】:

    • 创建兼容性表时,您仍然会得到双打;即使在主键上有唯一索引,仍然可以创建 (A,C) 和 (C,A) 对。在这种情况下,解决方案是创建一个触发器 before_insert 以验证该对在以其他方式尝试时也是唯一的
    • 我只使用 for 循环填充了前两列,我还没有填充第三列。比我尝试制作的示例产品要多得多,我将其简化了一点
    • 当产品不兼容时,它们仍会进入兼容性表,因为它不仅仅是二进制是/否。有些“仍在测试”。
    • 那更有意义。就像马克说的那样,您必须在保存到数据库之前创建某种验证,以确定是否存在冗余数据。这是一个什么样的应用程序?它是基于 Web 的还是桌面应用程序?为此,您使用什么语言来填充数据库或编写您的应用程序?
    【解决方案2】:

    正确规范化您的数据几乎总是值得的。较少的数据量和没有不一致的可能性只是其中两个最明显的原因。因此,如果您的兼容性实际上保证是对称的,并且永远保持对称(而不是某种向上与向后兼容性......),那么是的,您应该删除冗余行。

    唯一需要注意的是,将来您必须以规范顺序查询兼容性(对于较低的产品,但是您在查询的第一个槽中定义),或者使用析取查询,否则您可能错过一个合法的组合。 (这些选项中的第一个显然是更好的解决方案,因为第二个重新引入了不必要的处理工作。)

    【讨论】:

    • 如果用户输入他们想要检查的两个产品怎么办。我无法控制他们是否选择“A”和“B”而不是“B”和“A”
    • 那么您的业务代码需要在触发查询之前对这两个产品进行排序。我的意思是,这不像是直接从 TextInput 小部件生成数据库查询,对吧? 呃……对吧?
    • 我还没有做到(所以不,它不是直接从文本输入生成的),但这是一个好点。谢谢,我对 mySQL 还很陌生,只是想确保我所做的一切都是洁净的
    • 有没有办法自动化这个过程?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多