Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:传递关系的数据结构_Mysql_Database Design_Relational Database - Fatal编程技术网

MySQL:传递关系的数据结构

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-A与Entry-B相关,也知道Entry-B与Entry-C相关,即使我不明确知道Entry-A与Entry-C相关,但我想查询它

我认为解决办法是:

在插入、删除或更新时消除传递部分

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
...