MySQL:传递关系的数据结构

时间:2014-08-13 06:57:27

标签: mysql database-design relational-database

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

问题:过渡关系,一个条目可以通过其他条目建立关系,这些条目的关系我不想为每种可能性单独保存。

表示 - >我知道Entry-A与Entry-B有关,也知道Entry-B与Entry-C有关,即使我不明确知道Entry-A与Entry-C有关,我想查询它。

我认为解决方案是:

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

Entry:
    id
    representative_id

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

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

enter image description here

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

将B附加到A

enter image description here

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

将C附加到B

enter image description here

分离B-C:分离的项目将成为一个代表性的条目,这意味着它与自身有关。

enter image description here

分离B-C并将C附加到X

enter image description here

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

所以,删除A:

enter image description here

会导致:

enter image description here

您如何看待这个?这是一种正确的方法吗?我错过了什么吗?我应该改进什么?

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

    选择 *     来自条目a     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);

关于需要此功能的应用程序:

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

参考:某制造商的某个产品的OEM编号。

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

我必须以某种方式连接这些参考文献,当客户搜索某个数字时(不管他有什么类型的数字)我可以列出确切的结果和替代产品。

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

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

示例:

Asas过滤器制造商," AS 1" filter有这些交叉引用(表示,替换这些):

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是相同的,即使我只知道(AS 1 - > alfa romeo 101000603000)和(作为1 - - > alfa romeo 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..");

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

1 个答案:

答案 0 :(得分:0)

目前尚不清楚你想要做什么,而且你不清楚你是否理解如何思考&设计关系。但是您似乎希望满足“[id]的行是成员[rep_id]命名的集合的成员”。

不再考虑表示和指针。只需找到填写(命名)空白语句(“谓词”),说明您对应用程序情况的了解,并可以结合询问您的应用程序情况。每个语句都有一个表(“关系”)。表的列是空白的名称。表的行是使其语句成立的行。查询具有根据其表的语句构建的语句。结果的行是使其语句成立的行。 (当查询具有表名的JOIN时,其语句与表的语句相同.UNION ORs它们.EXCEPT输入AND NOT。WHERE和条件。通过SELECT删除列对应于逻辑EXISTS。)

也许你的应用程序情况是一堆带有值和指针的单元格。但我怀疑你的细胞和指针和连接以及连接和插入只是你解释和解释的方式。证明你的桌子设计。您的应用程序似乎与集或分区有关。如果你真的试图表示关系,那么你应该理解关系表代表一种关系。无论如何,您应该确定表语句是什么。如果您需要设计帮助或批评,请告诉我们有关您的应用情况的更多信息,而不是关于它们的表示。所有关系表示都是通过满足语句的行表。

您真的需要通过代表元素来命名集合吗?如果我们不关心名称是什么,那么我们通常使用由DBMS选择的“代理”名称,通常通过一些整数自动增量工具。为集合使用这种与成员资格无关的名称的好处是我们不必重命名,特别是通过选择元素。