0

我建立了一个数据库,并为不同种类的项目提供了大约 8 个不同的表。我这样做是因为每个表都是一个类别,每个项目都有不同的字段,所以我无法将它们全部设为 1 个表。我遇到的问题是我需要 itemID 字段在所有表中都是唯一的。不仅仅是每张桌子都是独一无二的。

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

我希望我解释得对。:)

4

3 回答 3

0

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

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

于 2012-05-26T10:59:54.920 回答
0

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

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

在插入时,请确保在插入子表之前始终将新值插入父表(否则会产生完整性违规)。

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

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

于 2012-05-26T10:56:03.673 回答
0

最简单的方法是将每个 PK 转换为使用GUIDJeff Atwood有一篇很好的文章讨论了 ID 与 GUID 的相对优点。MySQL 中甚至还有一个生成UUID的函数。警告,我从未使用过此功能,我知道它在复制时确实存在一些问题,尽管我相信这些问题已在最近的版本中得到修复。

实现此目的的另一种方法是使用单独的表来控制实体本身并使用自动增量来保持 ID 的唯一性。然后,您的每个单独的表都将引用该表。就保持数据完整性的应用程序逻辑而言,这有点复杂,但这是可能的。

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

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

这里有更多关于将这种继承结构映射到关系数据库的信息。当然,如果您愿意在 MySQL 之外寻找,那么有各种 NoSQL 数据库更适合这种情况。

于 2012-05-26T11:12:39.160 回答