// Boost DFS example on an undirected graph.
// Create a sample graph, traverse its nodes
// in DFS order and print out their values.
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/depth_first_search.hpp>
#include <iostream>
using namespace std;
typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS> MyGraph;
typedef boost::graph_traits<MyGraph>::vertex_descriptor MyVertex;
class MyVisitor : public boost::default_dfs_visitor
{
public:
void discover_vertex(MyVertex v, const MyGraph& g) const
{
cerr << v << endl;
return;
}
};
int main()
{
MyGraph g;
boost::add_edge(0, 1, g);
boost::add_edge(0, 2, g);
boost::add_edge(1, 2, g);
boost::add_edge(1, 3, g);
MyVisitor vis;
boost::depth_first_search(g, boost::visitor(vis));
return 0;
}
EAV - допустимый вариант - он может быть сложным и неудобным из-за того, что фактически становится нетипизированными данными.
XML с XPath также может быть вариантом: http: // dev. mysql.com/tech-resources/articles/xml-in-mysql5.1-6.0.html
Я думаю, что в большинстве случаев вам потребуется сгенерировать динамический SQL, если поля для поиска могут различаться.
EAV работает довольно хорошо, так как часто можно отображать значения в несколько основных типов. В личном проекте у нас есть таблица с:
entity_id : INTEGER REFERENCES entities(id)
attr_id : INTEGER REFERENCES attributes(id)
value_bool : BOOLEAN
value_int : INTEGER
value_string : VARCHAR
value_text : TEXT
И информация об attr_id хранится в другой таблице, где мы можем найти атрибут типа и имени и тому подобное. Кроме того, разница между строкой и текстом заключается в том, что текст может иметь «полнотекстовый» поисковый индекс, в то время как строка является только базовым индексированием соответствия.
Если вы хотите запросить атрибут, вы ищите его в таблице атрибутов, а затем составьте запрос, установив правильное условие, например «WHERE attr_id = 12 AND value_string = 'sfds'».
Чтобы ускорить запросы, создайте условный индекс для двойных столбцов, например:
CREATE INDEX test ON eav(attr_id, value_int) WHERE value_int IS NOT NULL;
Альтернативой является также наличие настраиваемая функция базы данных, которая может индексировать и искать столбец, содержащий поле JSON. Гораздо тяжелее работать ...