我正在构建一组数据库,这些数据库互相连接并包含彼此的信息。数据库的主要功能之一是记录路径和端点,例如;
路径1越过端点point_1,point_2,point_3,point_4和point_5
Path_1
= p1-p2-p3-p4-p5
路径2穿过端点point_1,point_2和point_5
Path_1
= p1-p2-p5
数据库结构:
path_id | start_point | point_1 | point_2 | point_3 | end_point |
--------|-------------|---------|---------|---------|-----------|
1 | p_1 | p_2 | p_3 | p_4 | p_5 |
2 | p_1 | p_2 | | | p_5 |
等等......
我的问题是我不会总是知道要穿过多少分。它可能是5或者它可能超过15.如何构建数据库以便我可以分配可变数量的点? (路径顺序很重要)
要添加到此,每个点 - 点路径也都有一个与之关联的ID。例如p1-p2
= 0001
和p2-p3
= 0002
另外,我将如何构造SQL语句?在某些时候,我想查询跨越特定点的所有路径,如果我有太多的点,我恐怕我不知道如何创建一个语句这么久。
这可能是针对此需求的错误数据库设置,欢迎任何其他建议
答案 0 :(得分:1)
列表示元数据,您的点实际上是数据。更好的设计可能是:
path_id | point
--------|-------------
1 | p_1
1 | p_2
1 | p_3
1 | p_4
1 | p_5
2 | p_1
2 | p_2
2 | p_5
当然,您应该考虑添加列以获取更多信息(例如,如果相关的话,请订购'以及将这两列合并的英国)。
SELECT语句将为SELECT * FROM table WHERE point = 'p_1';
答案 1 :(得分:0)
不推荐使用RDBMS进行分层数据结构(特别是无限循环),这是为什么graph database被创建的原因。
Neo4j将以优雅的方式为您的样本提供服务。
对于关系解决方案,您可以使用路径枚举模式
像/usr/local/lib/
这样的UNIX路径是文件系统的路径枚举,其中usr是local的父节点,而local节点又是lib的父节点。
您可以创建一个包含路径图(项目层次结构)的表,称之为EnumPath。
我想查询跨越特定点的所有路径(如Pn)
SELECT EnumPath.PathName from EnumPath
WHERE EnumPath.Path LIKE '%Pn%'
从Pn开始的路径:
SELECT EnumPath.PathName from EnumPath
WHERE EnumPath.Path LIKE 'Pn%'
以Pn结尾的路径:
SELECT EnumPath.PathName from EnumPath
WHERE EnumPath.Path LIKE '%Pn'
我想查询跨越特定点的所有路径(如Pk和Pi ...)
SELECT EnumPath.PathName from EnumPath
WHERE EnumPath.Path LIKE '%Pk%'
AND EnumPath.Path LIKE '%Pi%'
AND ...
可以找到与此问题相关的更全面的答案here。