我构建了一个数据库,并为不同类型的项目提供了大约8个不同的表。我这样做是因为每个表都是一个类别,每个项目都有不同的字段,所以我无法将它们全部放在一个表格中。我遇到的问题是我需要itemID字段在所有表中都是唯一的。不仅每张桌子都是独一无二的。
例如,如果管理员在1个表中添加项目,则该项目的itemID不能与其他表格中的其他项目重复,否则会对我造成问题。请帮我设置正确。我可以直接在数据库中执行此操作吗?或者我是否需要制作一个PHP脚本来检查项目编号是否已经存在?
我希望我解释说得对。 :)
答案 0 :(得分:0)
创建一个表来保存全局唯一字段,这将是父表。
使所有其他全局唯一字段的外键指向新表(字段),这些将是子表。
在插入时,请确保在插入子表之前始终将新值插入父表中(否则会导致完整性违规)。
在更新时,请确保始终仅在父表中更新唯一字段,而不是在子表中更新。
在子表中的外键上添加另一个唯一约束,以便它们不能指向相同的父表值。
答案 1 :(得分:0)
您要么生成唯一ID(如GUID)并将其用作您的密钥(或作为备用唯一密钥)。或者在其中有一个名为say Entities且具有唯一ID的表,然后向其中添加外键。 想法是,您插入实体,获取您的ID,然后使用它插入子表。
打赌你不会再犯这个错误了。 :(答案 2 :(得分:0)
最简单的方法是将每个PK转换为使用GUID。 Jeff Atwood有一个很好的讨论ID和GUID的相对优点。那里 甚至是MySQL中的一个函数来生成UUIDs。警告,我从来没有使用过这个功能,我知道它在复制方面确实存在一些问题,尽管我认为这些问题已在最近版本中得到修复。
实现此目的的另一种方法是使用单独的表来控制实体本身并使用自动增量来保持ID唯一。然后,您的每个表都将引用此表。在保持数据完整性的应用程序逻辑方面,这有点复杂,但这是可能的。
或者您可以根据第二个选项拥有主表,另一个表包含不同类别之间不同参数的键/值对。如果额外参数都是主要实体信息的次要参数(在不同类别之间不相同),这可能是一个不错的选择。
哪个选项最适合您,实际上取决于数据模型的结构和语义以及您的用例(即您最常访问数据的方式)。
有关mapping this sort of inheritance structure to a relational database here的更多信息。当然,如果您愿意在MySQL之外寻找,那么有各种NoSQL数据库可以更好地适应这种情况。