未知列的结构数据库

时间:2015-10-20 17:45:57

标签: mysql sql database database-design

我正在构建一组数据库,这些数据库互相连接并包含彼此的信息。数据库的主要功能之一是记录路径和端点,例如;

路径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 = 0001p2-p3 = 0002

另外,我将如何构造SQL语句?在某些时候,我想查询跨越特定点的所有路径,如果我有太多的点,我恐怕我不知道如何创建一个语句这么久。

这可能是针对此需求的错误数据库设置,欢迎任何其他建议

2 个答案:

答案 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。

enter image description here

  

我想查询跨越特定点的所有路径(如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