MySQL:传递关系的数据结构

sza*_*kel 5 mysql database-design relational-database

我试图设计一个数据结构,以便于快速查询(删除,插入更新速度对我来说并不重要).

问题:传递关系,一个条目可以通过其他条目建立关系,其关系我不想为每种可能性单独保存.

意味着 - >我知道Entry-A与Entry-B有关,并且知道Entry-B与Entry-C有关,即使我不明确知道Entry-A与Entry-C有关,I想查询它.

我认为解决方案是:

插入,删除或更新时消除传递部分.

Entry:
    id
    representative_id
Run Code Online (Sandbox Code Playgroud)

我会将它们存储为集合,例如条目组(不是mysql集类型,数学集,对不起,如果我的英语错误).每个集合都有一个代表性条目,所有集合元素都与代表性元素相关.

新插入将插入Entry并将代表设置为自身.

在此输入图像描述

如果新插入的条目应该连接到另一个,我只需将新插入的条目的代表ID设置为引用条目的rep.id.

将B附加到A.

在此输入图像描述

没关系,如果我需要将它连接到不是代表性条目的东西,它将是相同的,因为集合中的每个条目都具有相同的rep.id.

将C附加到B

在此输入图像描述

分离BC:分离的项目将成为代表性条目,这意味着它将与自身相关.

在此输入图像描述

拆分BC并将C连接到X.

在此输入图像描述

删除:如果我删除了非代表性条目,则可以自我解释.但删除rep.entry有点困难.我需要为集合选择一个新的rep.entry,并将每个集成员的rep.id设置为新的rep.entry的rep.id.

所以,删除A:

在此输入图像描述

结果如下:

在此输入图像描述

你怎么看待这件事?这是一种正确的方法吗?我错过了什么吗?我应该改进什么?

编辑:查询:所以,如果我想查询与某个条目相关的每个条目,其id我知道:

SELECT*FROM条目LEFT JOIN条目b ON(a.rep_id = b.rep_id)WHERE a.id =:id

SELECT * FROM AlkReferencia
WHERE rep_id=(SELECT rep_id FROM AlkReferencia
    WHERE id=:id);
Run Code Online (Sandbox Code Playgroud)

关于需要这个的应用程序:

基本上,我存储车辆部件号(参考),一个制造商可以制造多个部件,可以替换另一个,另一个制造商可以制造替换其他制造商部件的部件.

参考:一个制造商的OEM编号到某个产品.

交叉引用:制造商可以制造出旨在替换其他制造商的产品的产品.

我必须以某种方式连接这些引用,当客户搜索数字时(无论他有什么类型的数字)我可以列出确切的结果和替代产品.

要使用上面的示例(最后一张图片):B,D和E是我们可能存储的不同产品.每个人都有一个制造商和一个字符串名称/参考(我之前称之为数字,但它几乎可以是任何字符链).如果我搜索B的参考编号,我应该返回B作为精确结果,D,E作为替代.

到现在为止还挺好.但我需要上传这些参考号码.我不能只是从ALL-IN-ONE数据库迁移它们.大多数时候,当我上传我从制造商处获得的参考资料时(不知何故,大部分时间都来自手工,但我也可以使用目录),我只得到一个列表,制造商告诉哪些其他参考编号指向他的编号.

例.:

Asas过滤器制造商,"AS 1"过滤器有这些交叉引用(意味着,替换这些):

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
...
Run Code Online (Sandbox Code Playgroud)

将所有AS 1参考文献写下来需要很长时间,但有很多(~1500?).它是一个过滤器.有超过4000个过滤器,我需要存储引用(这些只是过滤器).我想你可以看到,我无法连接所有东西,但我必须知道阿尔法罗密欧101000603000和105000603007是相同的,即使我只知道(AS 1 - > alfa romeo 101000603000)和(1 - > alfa罗密欧105000603007).这就是为什么我想把它们组织起来.每个集合成员只能使用rep_id连接到另一个集成员,该成员将是代表成员.当有人想要(比如,管理员,上传这些引用时)附加一个新的引用集合成员,我只是INSERT INTO References (rep_id,attached_to_originally_id,refnumber) VALUES([rep_id of the entry what I am trying to attach to],[id of the entry what I am trying to attach to], "16548752324551..");

另一件事:我不需要担心插入,删除,更新速度那么多,因为它是我们系统中的管理任务,很少会完成.