SQL设计模式:如何在mashup中存储来自不同站点的多个唯一ID?

时间:2010-02-01 03:41:09

标签: mysql cakephp

我正在构建一个mash-up来存储来自多个REST API数据源的项目的元数据。我希望能够根据所有不同数据源中汇总的数据生成典型的源(最新,最高评级,最多观看等),还可以添加标签(即多对多关系)。

我的问题是每个数据源都有不同的方式通过REST API发出唯一ID。我需要有关用于MySQL数据模型的最佳模式的建议。

我目前的解决方案是对所有项目和一个复合键使用1个表,但连接很长,而cakePHP本身不处理复合键:

datasource_id smallint,  
datasource_item_id VARCHAR(36), // some datasources issue alpha keys

问:将自动增量主键添加到我的表并将所有内部联接/索引从外部UID转换为内部UID是否可行/更好? :

  

id int(10)unsigned NOT NULL auto_increment,

问:枚举是否是存储datasource_id的有效数据类型(应该有10个不同的数据源)?

问:从长远来看,还有其他方法可以产生更好,更具可扩展性的结果吗?

1 个答案:

答案 0 :(得分:1)

大多数情况下,我只能确认您已经考虑过的解决方案。

由于表模式中使用的存储类型不必与数据类型相同(这就是SQLite 2为untyped而SQLite 3为so few types)的原因,第一次冲动与您当前的解决方案相同。

遵循另一种思想,即任意的ID(即那些不基于您建模的属性的ID)应该保存在您自己的数据库内部,建议您提到的第二个解决方案:添加{{1列。这所学校的一个原因是你不希望你的桌子依赖别人的内部,尽管这不是一个问题。由于cakePHP不支持复合键,因此这似乎是最可行的选择。

另一种解决方案是使主键列成为来自其他组合键列的数据的串联。也就是说,添加一个额外的列,与自动递增ID一样,但添加一个存储非任意值的列。这属于非规范化的范畴,并且具有暗示的所有警告和警告。

如果SQL是二阶逻辑,您可以轻松地为每个数据源提供自己的表。由于SQL是第一顺序,因此这不是一个非常可扩展的解决方案。

前三个都有下行空间。每个数据源都有自己的ID类型;当在同一列中存储来自不同源的ID时,您需要定义其他约束以在数据库级别强制执行类型完整性,可能以触发器的形式(因为MySQL不支持id子句)。

  

问:枚举是否是存储datasource_id的有效数据类型(应该有10个不同的数据源)?

ENUM的storage requirements为1或2个字节,具体取决于有多少个不同的值。在十个数据源中,每行只应使用一个字节。这仍然浪费了4位/行。是否有效率我会留给你。