2012-05-26 38 views
0

我构建了一个数据库,并且针对不同种类的项目有大约8个不同的表。我这样做是因为每张桌子都是一个类别,每个项目都有不同的字段,所以我不能把它们全部放在一张桌子上。我遇到的问题是我需要itemID字段在所有表中都是唯一的。不仅仅是每张桌子独一无二的。MySQL数据库唯一字段(不是表唯一)

例如,如果管理员在1个表格中添加项目,则该项目的itemID不能与另一个表格中的另一个项目重复,否则会对我造成问题。请帮我设置这个正确的。我可以直接在数据库中执行此操作吗?或者我需要制作一个php脚本来检查商品编号是否已经存在?

我希望我解释说得对。 :)

+0

听起来像你应该重新考虑整个结构,如果它不晚。 – 2012-05-26 10:45:05

回答

0

创建一个表来保存全局唯一字段,这将是父表。

使所有其他全局唯一字段的外键指向新表(字段),这些将是子表。

插入时请确保在插入到子表之前总是将新值插入到父表中(否则会产生完整性违例)。

在更新时请确保您始终只在父表中更新唯一字段,而不是在子表中更新唯一字段。

对子表中的外键添加进一步的唯一约束,以便它们不能指向相同的父表值。

0

您可以生成唯一的ID(如GUID)并将其用作密钥(或作为备用唯一密钥)。或者有一个名为Entity的表格,其中包含一个唯一的ID,然后为其添加一个外键。 想法是,你插入实体,让你的id回来,然后用它插入子表。

打赌你不会再犯这个错误。 :(

0

做到这将是每个PK使用GUID转换的最简单的方法。这是一个很好articly通过Jeff Atwood,讨论ID的相对优点VS的GUID。有 是在MySQL甚至函数生成UUIDs。警告,我从来没有使用过这个功能,我知道它在复制时确实有一些问题,尽管我相信这些功能已经在最近的版本中修复过了。

另一种方法是获得单独的表来控制实体本身并使用自动增量来保持ID是唯一的,然后你的每个表都会引用这个表,这在应用方面有点复杂n逻辑来保持数据的完整性,但这是可能的。

或者您可以根据第二个选项拥有主表和另一个包含不同类别之间参数的键/值对的表。如果额外的参数都是次要的主要实体信息(这在不同类别之间不会有所不同),这可能是一个不错的选择。

哪个选项最适合您,这取决于您的数据模型和用例的结构和语义(即您最常访问数据的方式)。

有更多信息关于mapping this sort of inheritance structure to a relational database here。当然,如果你愿意看看MySQL以外的地方,那么有各种NoSQL数据库可以更好地适应这种情况。