mysql - MySQL:传递关系的数据结构

标签 mysql database-design relational-database

我试图设计一个数据结构,以便方便快捷地查询(删除、插入更新速度对我来说并不重要)。
问题是:传递关系,一个条目可以通过其他条目建立关系,我不想为每个可能性分别保存这些条目的关系。
意思是-->我知道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.entry,并将每个集合成员的rep.id设置为新rep.entry的rep.id。
因此,删除以下内容中的a:
会导致:
你觉得这个怎么样?这是正确的方法吗?我遗漏了什么吗?我应该改进什么?
编辑:
查询:
所以,如果我想查询与某个条目相关的每个条目,我知道该条目的id:
选择*
从条目A
左连接条目b on(a.rep_id=b.rep_id)
其中a.id=:id
SELECT * FROM AlkReferencia
WHERE rep_id=(SELECT rep_id FROM AlkReferencia
    WHERE id=:id);

关于需要此功能的应用程序:
基本上,我存储的是车辆零件号(参考),一个制造商可以制造多个零件来替换另一个制造商,另一个制造商可以制造零件来替换其他制造商的零件。
参考:一个制造商对某一产品的oem编号。
交叉引用:制造商可以制造产品,其目标是从另一个制造商替换另一个产品。
我必须以某种方式连接这些参考资料,当客户搜索一个号码(不管他有什么号码)时,我可以列出一个确切的结果和替代产品。
使用上面的例子(最后一张图片):B、D和E是我们商店里可能有的不同产品。每一个都有一个制造商和一个字符串名/引用(我以前叫它数字,但它几乎可以是任何字符链)。如果我搜索B的参考号,我应该返回B作为精确结果,返回D,E作为替代。
到现在为止,一直都还不错。但我需要上传这些参考号。我不能把它们从一个一体化的数据库中迁移出来。大多数时候,当我上传从一个制造商那里得到的参考资料时(不知何故,大部分时间是手动的,但我也可以使用目录),我只得到一个列表,制造商告诉我哪个参考号码指向他的号码。
例子。:
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
...

写下所有的as 1参考文献需要很长时间,但是有很多(~1500?)这是一个过滤器。有4000多个过滤器,我需要存储这些引用(这些只是过滤器)。我想你可以看到,我不能连接所有的东西,但我必须知道阿尔法罗密欧101000603000和105000603007是一样的,即使我只知道(作为1-->阿尔法罗密欧101000603000)和(作为1-->阿尔法罗密欧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..");
另一件事:我不需要太担心插入、删除、更新的速度,因为这是我们系统中的一项管理任务,很少会完成。

最佳答案

现在还不清楚你想做什么,也不清楚你是否理解如何进行相关的思考和设计。但您似乎希望行满足“[id]是由成员[rep_id]命名的集合的成员”。
停止用表示和指针来思考。只需找到fill in the-(named-)blank语句(“谓词”)即可,这些语句可以说明您对应用程序情况的了解,并且可以组合起来询问您的应用程序情况。每个语句都有一个表(“relation”)。表中的列是空格的名称。表的行是使其语句为真的行。查询具有从其表的语句生成的语句。其结果的行是使其语句为真的行。(当查询有表名联接时,它的语句和表的语句。工会或他们。除了投入和不投入。哪里有条件。按select删除列对应于logical exists。)
也许您的应用程序环境是一堆带有值和指针的单元格。但是我怀疑你的单元格、指针、连接、连接和插入只是你解释和证明你的表设计的方式。您的应用程序似乎与集合或分区有关。如果您真的试图表示关系,那么您应该理解关系表表示关系。无论如何,您应该确定表语句是什么。如果您需要设计帮助或批评,请告诉我们有关您的应用程序情况的更多信息,而不是它们的表示。所有的关系表示都是由满足语句的行组成的表。
您真的需要按代表元素命名集合吗?如果我们不关心名称是什么,那么我们通常使用dbms选择的“代理”名称,通常是通过一些整数自动增量工具。对集合使用这种独立于成员身份的名称的好处是,我们不必重命名,特别是通过选择元素。

关于mysql - MySQL:传递关系的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25279928/

相关文章:

c++ - C++ 中的 MySQL 段错误

sql - 在 SQL 或 MySQL 中不使用 JOIN 关键字的连接是否有问题?

MySQL 数据库设计 - 将这些字段放入用户表中还是创建新表?

php - MySQLi 查询默默失败,但在 SQL shell 中成功

sql - 如何用想要的结果做这个 GROUP BY?

mysql - 如何对价格调节因素建模?

sql - LIKE 100k 记录上的 2 列或 200k 记录上的一列更快吗?

database-design - 将纬度/经度存储为整数有什么好处?

ms-access - 查找与关系 Microsoft Access

mysql - 合并具有一对一关系的表