处理个人身份和全球身份证

时间:2011-09-06 19:22:00

标签: mysql ruby-on-rails-3 design-patterns

我有一个使用标准ID整数自动增量值的应用。我还有另一个管理global_id的表,该表当前设置为整数。我认为最好对这个全局值使用非整数,以便根据是否存在非整数来清楚是否正在使用item id或global 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作为全局值。也许,有一个rails组件已经这样做了吗?

THX

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

不需要名称空间,因为如果一个名称只设置为int而另一个名称设置为其他任何名称空间,那么你知道你正在查看global_id。

3 个答案:

答案 0 :(得分: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);

添加新记录时,请在此表中插入包含tablename和new id的相应行,并使用结果ID作为全局唯一ID。

您可能已经有了这个并且正在寻找另一种存储方法来添加角色。如果你真的想要两种类型的ID使用相同的URL,我建议只在ID字段中加上“推断”前缀。例如,如果是两个URL:

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

你会检查第一个字符。如果是g,请将其剥离并检查全局表。否则,请检查相关表格。但是,我仍然建议使用单独的URL。

答案 1 :(得分:0)

我只是为这个字段使用varchar。这样,您可以将任何您想要的内容附加到原始项目ID。也许在原始id(下划线加4个随机字符)中添加类似_a27d的东西 - 所以你总是可以在下划线之前查看并获得原始id。

答案 2 :(得分:0)

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

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

每个表都有自己的id,该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。