Преобразование базы данных SQLite в тройное хранилище

Может ли кто-нибудь описать шаги, необходимые для преобразования базы данных SQLite в тройное хранилище?

Есть ли инструмент, который может выполнить эту задачу?


person tjb    schedule 24.01.2011    source источник


Ответы (2)


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

person tjb    schedule 14.04.2011
comment
Это звучит потрясающе. Это правда? :-) … ладно, верно, как в: вы можете привести статью, или ссылку, или что-то в этом роде? Спасибо! - person Benjohn; 15.10.2017
comment
Нет, я ничего не могу процитировать, насколько я знаю, это оригинал. Это можно сделать и другими способами (например, 1 большая таблица с тремя столбцами, A, B и типом связи между ними). Но когда вы глубоко задумываетесь о том, что такое таблица, вы понимаете, что она может обозначать тип отношений (или не обозначать, как кому угодно). - person tjb; 19.10.2017
comment
Интересно, какой была бы производительность, если бы вы использовали SQLite в качестве тройного хранилища таким образом. - person Rei Miyasaka; 20.08.2019
comment
Не знаю, возможно, довольно плохо, после преобразования базы данных, вероятно, было бы лучше экспортировать ее во что-то, созданное для этой цели: jena.apache.org - person tjb; 21.08.2019

Функция преобразования в тройное преобразование любых реляционных данных в тройной формат:

   def transform_to_triple(source,db_name,table,result):
    #get the list of relations for the selected DB
    max_records = 100
    response = []
    x_print = lambda *x : response.append("(%s)\n" %("".join(["%s"%(v) for v in x])))

    id = 1

    x_print(id,',(db_name:string),',db_name)
    logger.info("(%s,(db_name,string), %s)" %(id,db_name))

    tables = []
    table_list = [table,]
    for i, _table in enumerate(table_list):
        _table_id = id + i + 1
        x_print(id,',(rel:id),', _table_id)
        logger.info("(%s,(rel, id), %s)" %(id, _table_id))

        _schema = get_column_list(source, db_name,_table)
        tables.append((_table_id, _table, _schema))
    for _table in tables:
        _table_id = _table[0]
        x_print(_table_id,',(rel_name:string),',_table[1])
        for j,row in enumerate(result):
            #lets assume there is always less than 10 k tuples in a table
            _tuple_id = _table_id * max_records + j + 1
            x_print(_table[0],',(tuple:id),', _tuple_id)
            logger.info("(%s,(tuple, id), %s)" %(_table[0],_tuple_id))
        for j,row in enumerate(result):
            _tuple_id = _table_id * max_records + j + 1
            for k,value in enumerate(row):
                x_print(_tuple_id, ",(%s : %s)," %(_table[2][k][0], _table[2][k][1]), value)   
    return "%s" %("".join(response))

Функция get_column_list возвращает список столбцов в таблицах базы данных:

def get_column_list(src_name,db_name,table_name):
     cur = get_connect() #Connecting with tool DB
     query = '''select db_name, host, user_name, password from "DataSource" where src_name = '%s' and db_name = '%s' '''%(src_name, db_name)
     cur.execute(query)
     data  = cur.fetchall()
     (db, host, username, password) = data[0]
     _module = get_module(src_name)
     cursor = _module.get_connection(db, host, username, password)
     try:
          _column_query = _module.COLUMN_LIST_QUERY %(db_name, table_name)
     except TypeError, e:
          try:
               _column_query = _module.COLUMN_LIST_QUERY %(table_name)
          except TypeError, e:
               _column_query = _module.COLUMN_LIST_QUERY

     cursor.execute(_column_query)
     column_list = cursor.fetchall()
     return column_list
person Mrityunjay Singh    schedule 11.10.2015
comment
Кнопка "за" есть, а кнопки "мне нравится" нет! Я хочу понравиться. - person Benjohn; 15.10.2017