2011-09-06 47 views
0

我有一个使用标准ID整数自动增量值的应用程序。我还有另一个管理当前设置为整数的global_id的表。我认为最好对这个全局值使用一个非整数,这样可以根据是否存在非整数来清楚地使用项目ID还是全局ID: 例如:处理个人ID和全局ID

site.com/item/id/123 - item id 
site.com/item/id/12j45 - global id 

在内部,全局标识表仍然保留它的id值(对此不确定)。但我想有一个非整数global_identifier_id。有没有可以处理这个问题的MySQL数据类型?就像获取id值并添加一个(可能)随机字符(1到1b,2到2d)。

有没有更好的方案来处理这个问题?例如,也在考虑使用注册到短语的对象的id对象 - 因此位置是id 123,但是成为123loc作为全局值。也许,有一个轨道组件已经这样做了?

THX

@Doug
关于跨表唯一肯定的;基本上是对象关系阻碍不匹配问题的一个版本(对象列表)。目前有两组ID,我手动管理它与您建议的两个名称空间类似。

命名空间并不是必需的,但是因为如果一个设置为int而另一个设置为其他任何设置,则您知道您正在查看global_id。

回答

0

这将是优选的是具有两个命名空间,如:

site.com/item/id/123 
site.com/item/gid/12j45 

否则,将要求global_id有一个字符时,从整数字段区分它和产生不必要的周期,以确定如何根据数据的内容查询数据。

你想通过拥有global_id来完成什么?这是多个表中的唯一性水平吗?如果是这样,只需在id字段附加一个字母就不够了。大概设置一些触发器可以做到这一点,但我会首先考虑整个过程。

更新:对于跨多个表的独特性,有一堆答案,但一个简单的一种是:

CREATE TABLE global_references (
    id int NOT NULL auto_increment PRIMARY KEY, 
    reference_type varchar(50) NOT NULL, 
    reference_id int NOT NULL, 
    UNIQUE KEY akGlobalReferences (reference_type, reference_id); 

当您添加一个新的记录,插入相应的行此表与表名和新ID,并使用生成的ID作为您的全球唯一ID。

你可能已经有了这个地方,正在寻找一种替代的存储方法来添加一个字符。如果你真的想要这两种类型的ID都使用相同的URL,我建议只需在ID字段中添加一个“推断”前缀。举例来说,如果两个URL:

sites.com/item/id/123 
sites.com/item/id/g123 

您将检查的第一个字符。如果是g,请将其剥离并检查全局表格。否则,请检查相关表格。不过,我仍然为此推荐单独的网址。

+0

跨多个表的唯一性 - 是 – timpone

+0

您的更新是我目前拥有的 - 想到一种重构方式,以便在UI方面,我们不必知道我们是处理object_id还是全局引用ID。 thx – timpone

0

我只是用这个字段的varchar。这样,你可以追加任何你想要的原始物品ID。也许可以在原始ID(下划线加上4个随机字符)中添加_a27d之类的东西 - 这样您就可以在下划线之前查看并获取原始ID。

+0

是的 - 这样的事情 - 甚至可能有d指的是一个特定的对象,所以甚至不需要是一个查找步骤 – timpone

+0

或者你可以用一个“G”前缀的id - 表示它是全局ID –

0

您可以避免同时拥有本地ID和全局ID。

CREATE TABLE global_ids (
    id int NOT NULL auto_increment PRIMARY KEY); 

每个表都有自己的ID,它具有global_ids表的外键。

CREATE TABLE t1 (
    id int NOT NULL auto_increment PRIMARY KEY, 
    FOREIGN KEY (id) REFERENCES global_ids(id)); 

CREATE TABLE t2 (
    id int NOT NULL auto_increment PRIMARY KEY, 
    FOREIGN KEY (id) REFERENCES global_ids(id)); 

你还是最终会做两个刀片(一个用于global_ids,那么一个实际的表),但你不必处理两种类型的ID。