Проектирование баз данных для пользовательского конструктора форм (и устройство хранения данных результатов)

// 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;
}
7
задан KushalP 31 October 2009 в 13:03
поделиться

2 ответа

EAV - допустимый вариант - он может быть сложным и неудобным из-за того, что фактически становится нетипизированными данными.

XML с XPath также может быть вариантом: http: // dev. mysql.com/tech-resources/articles/xml-in-mysql5.1-6.0.html

Я думаю, что в большинстве случаев вам потребуется сгенерировать динамический SQL, если поля для поиска могут различаться.

3
ответ дан 7 December 2019 в 10:04
поделиться

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. Гораздо тяжелее работать ...

3
ответ дан 7 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: