2015-10-20 2 views
1

Я структурирую набор баз данных, которые все связывают и содержат информацию друг о друге. Одна из основных функций баз данных - запись путей и конечных точек, например;Структура Базы данных для неизвестных столбцов

Path 1 крестики конечные точки point_1, point_2, point_3, point_4 и point_5
Path_1 = p1-p2-p3-p4-p5
Path 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. Как мне создать базу данных, чтобы я мог распределить переменное количество баллов? (Важно указать порядок путей)

Чтобы добавить к этому, каждый путь точки точки также имеет связанный с ним идентификатор. Например p1-p2 = 0001 и p2-p3 = 0002

Кроме того, как бы я структурировать оператор SQL? В какой-то момент я хочу запросить все пути, пересекающие определенные точки, и если у меня слишком много очков, я боюсь, что не знаю, как создать заявление так долго.

Это, вероятно, неправильно настройки базы данных для этого необходимо, любые другие предложения приветствуются

ответ

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';

+0

Недостаточно OP необходимо сохранить порядок точек в пути (я думаю), поэтому вы можете добавить еще 2 столбца типа 'id' и' nextId' – Alex

+0

Вы правы, хотя не было указано, что это необходимо. Если это так, я предложил добавить столбец «order» (сбросить для каждого path_id). –

+0

@Alex Порядок точек важен, поскольку путь от p_5 до p_3 не совпадает с p_3-p_5 – lomas09

0

Использование СУБД для иерархической структуры данных (особенно бесконечные петли) не рекомендуется, его почему graph database были созданы.
Neo4j будет служить вашему образцу в элегантном подходе.

Для реляционного решения вы можете использовать шаблон перечисления пути.
Путь UNIX как /usr/local/lib/ - это перечисление пути файловой системы, где usr является родительским элементом local, который, в свою очередь, является родителем lib.
Вы можете создать таблицу, содержащую диаграммы путей (иерархия элементов), называя ее EnumPath.

enter image description here

Я хочу, чтобы запросить все пути, которые пересекают конкретную точку (например, Р)

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' 

Я хочу, чтобы запросить все пути, которые пересекают определенные точки (например, Рк и Pi ...)

SELECT EnumPath.PathName from EnumPath 
WHERE EnumPath.Path LIKE '%Pk%' 
AND EnumPath.Path LIKE '%Pi%' 
AND ... 

Более полный ответ, связанные с этим вопросом можно найти here.

Смежные вопросы