查找 “数据库标准化。”
在最极端的,你可以把它分成4个表:
- Product_Types:产品类型(VARCHAR/CHAR),身份证(INT)
- 产品:ID /产品ID(INT)产品类型(INT,绑定到Product_Types.id的外键)
- Test_Parameters:Type(VARCHAR/CHAR - 压力,温度等),id(INT)
- Test_Scores:Product(INT,Products.id的外键),测试(INT,Test_Parameters.id的外键),分数(INT /任何似乎合适的),时间戳。
理论上你可以不用第一个和第三个表,而只是在每个记录中保存名称(即产品条目:id = 12345,type =“chair”)。这是非常稍快的检索这种方式,但它也没有强大的反对的人拼错的东西(即SELECT * FROM产品其中type =“椅子”将错过具有type =“chiar”的条目),因为你占用更多的存储空间'一遍又一遍地保存文本名称。无论如何,这是多对一关系的基本模型,这就是您要寻找的产品:一个产品,许多测试(或者全部四个表格,多对多:许多产品,许多测试类型)。你需要他们在单独的表,与给出的ID每一个产品,然后一个外键,每个测试结果链接到它适用于产品。
现在,让我们来谈谈约束。
一,我可能会考虑投掷将是对测试结果表的索引无论是产品ID 和测试类型,然后一定要使用“对重复密钥更新”这样一个独特的密钥旧的价值被新的价值所覆盖。那样,你肯定只能对每个产品的每个测试都有一个结果。如果您还想保留旧记录,请忽略此段落。
你肯定会失去的一件事就是要求所有测试都是针对给定产品完成的。这将需要在数据库之外完成。如果你想要求每一个产品都填充所有的列,那么你必须按照你一直这样做的方式来完成它(在每个测试中,每个测试在每个测试中都有NOT NULL约束的巨大统一表中)测试列),因为现在测试结果和对象ID在功能上相互依赖(两者都不存在没有其他)。
谢谢你彻底回答Mayhem。这使我更清楚。我有一个问题供将来参考。如果我在Access中重新创建这个项目,我仍然可以使用绑定的表单来输入数据?或者是否最好让它解除绑定并简单地用SQL插入记录? – Pluto035
不知道 - 我从来没有使用Access,我也不知道你的堆栈的其他部分是什么样的。 – jfmatt