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..");
另一件事:我不需要担心插入,删除,更新速度那么多,因为它是我们系统中的管理任务,很少会完成.