MySQL:传递关系的数据结构
我试图设计一个数据结构,以便于快速查询(删除、插入和更新速度对我来说并不重要) 问题是:传递关系,一个条目可能与其他条目有关系,我不想为每种可能性单独保存这些条目的关系 表示-->我知道Entry-A与Entry-B相关,也知道Entry-B与Entry-C相关,即使我不明确知道Entry-A与Entry-C相关,但我想查询它 我认为解决办法是: 在插入、删除或更新时消除传递部分MySQL:传递关系的数据结构,mysql,database-design,relational-database,Mysql,Database Design,Relational Database,我试图设计一个数据结构,以便于快速查询(删除、插入和更新速度对我来说并不重要) 问题是:传递关系,一个条目可能与其他条目有关系,我不想为每种可能性单独保存这些条目的关系 表示-->我知道Entry-A与Entry-B相关,也知道Entry-B与Entry-C相关,即使我不明确知道Entry-A与Entry-C相关,但我想查询它 我认为解决办法是: 在插入、删除或更新时消除传递部分 Entry: id representative_id 我会将它们存储为集合,就像一组条目一样(不
Entry:
id
representative_id
我会将它们存储为集合,就像一组条目一样(不是mysql集合类型,是数学集合,如果我的英语错了,很抱歉)。每个集合都有一个代表性条目,所有集合元素都与代表性元素相关
新的插入将插入条目,并将代表设置为自己
如果新插入的条目应该连接到另一个条目,我只需将新插入条目的代表id设置为引用条目的rep.id
把B附在A上
没关系,如果我需要将它连接到一个不具有代表性的条目,它将是相同的,因为集合中的每个条目都将具有相同的rep.id
将C连接到B
拆离B-C:拆离的项目将成为代表性条目,这意味着它将与其自身相关
拆下B-C并将C连接到X
删除:
如果我删除了一个不具代表性的条目,这是不言自明的。但是删除代表条目有点困难。我需要为集合选择一个新的rep.entry,并将每个集合成员的rep.id设置为新rep.entry的rep.id
因此,请删除以下内容中的A:
这将导致:
你觉得这个怎么样?这是正确的方法吗?我错过什么了吗?我应该改进什么
编辑:
查询:
因此,如果我想查询与某个条目相关的每个条目,我知道该条目的id:
挑选*
从条目a
左连接条目b打开(a.rep_id=b.rep_id)
其中a.id=:id
关于需要此功能的应用程序:
基本上,我存储的是车辆零件号(参考),一个制造商可以制造多个零件来替换另一个,另一个制造商可以制造零件来替换其他制造商的零件
参考:某一产品的一个制造商OEM编号
交叉引用:制造商可以制造目标是替换另一制造商的另一产品的产品
我必须以某种方式连接这些参考资料,当客户搜索一个号码(不管他有什么号码)时,我可以列出准确的结果和替代产品
使用上面的例子(最后一张图片):B、D和E是我们商店里可能有的不同产品。每一个都有一个制造商和一个字符串名/引用(我以前称它为number,但它几乎可以是任何字符链)。如果我搜索B的参考号,我应该返回B作为精确结果,并返回D,E作为备选方案
到目前为止还不错。但我需要上传这些参考号。我不能只是从一个多功能数据库中迁移它们。大多数时候,当我上传我从制造商那里得到的参考资料时(不知何故,大部分时间是手动的,但我也可以使用目录),我只会得到一个列表,其中制造商告诉哪些其他参考号指向他的编号
例如:
Asas过滤器制造商,“AS 1”过滤器具有以下交叉引用(表示替换):
写下所有的AS 1引用要花很多时间,但有很多(~1500?)。这是一个过滤器。有4000多个过滤器,我需要存储这些引用(这些只是过滤器)。我想你可以看到,我不能连接所有的东西,但我必须知道阿尔法罗密欧101000603000和105000603007是相同的,即使我只知道(作为1-->阿尔法罗密欧101000603000)和(作为1-->阿尔法罗密欧105000603007)。
这就是为什么我想把它们组织成集合。每个集合成员将仅连接到另一个集合成员,该集合成员具有代表性成员的rep_id。当有人想(比如,管理员,上传这些引用时)将新引用附加到集合成员时,我只需插入引用(rep_id,attached_to_original_id,refnumber)值([rep_id of the entry what is thing to attached to],[id of the entry what is thing to attached to],“16548752324551..)代码>
另一件事:我不需要太担心插入、删除和更新的速度,因为这在我们的系统中是一项管理任务,很少会完成 不清楚您想做什么,也不清楚您是否了解如何进行关联性思考和设计。但您似乎希望行满足“[id]是由成员[rep_id]命名的集合的成员”
停止用表示法和指针来思考。只需在-(命名的)空白语句(“谓词”)中查找和填充,这些语句说明您对应用程序情况的了解,并且您可以组合起来询问您的应用程序情况。每个语句都得到一个表(“关系”)。表中的列是空格的名称。表中的行是使其语句为真的行。查询有一个从其表语句生成的语句。其结果行是使其语句为真的行。(当查询具有表名的联接时,其语句和表的语句。UNION或它们。puts in和NOT除外。其中包含一个条件。通过SELECT删除列对应于逻辑存在。)
也许您的应用程序情况是一组带有值和指针的单元格。但是我怀疑你的单元格、指针、连接、附加和插入只是你解释和证明你的表设计的方式。您的应用程序似乎与wi有关
SELECT * FROM AlkReferencia
WHERE rep_id=(SELECT rep_id FROM AlkReferencia
WHERE id=:id);
GOLDEN SUPER --> 1
ALFA ROMEO --> 101000603000
ALFA ROMEO --> 105000603007
ALFA ROMEO --> 1050006040
RENAULT TRUCKS (RVI) --> 122577600
RENAULT TRUCKS (RVI) --> 1225961
ALFA ROMEO --> 131559401
FRAD --> 19.36.03/10
LANDINI --> 1896000
MASSEY FERGUSON --> 1851815M1
...