Запрос набора данных, базы данных или поиск в файле? - PullRequest
0 голосов
/ 12 мая 2019

У меня есть набор файлов, ~ 300 файлов каждый с 50000 строк. Каждая строка представляет собой строковый тег с двоичным значением (1 или 0). Все файлы имеют одинаковые записи, но разные двоичные значения. Пример файла ниже.

Tag1    0
Tag2    1
...
Tag50000    0

Я намереваюсь создать веб-инструмент Python Flask с несколькими функциями, которые будут сравнивать два «файла» или находить каждый «файл» с тем, где конкретный тег равен 1. Другой вариант - искать все файлы в каталоге для сравнения. Я считаю, что использование некоторой базы данных SQL было бы невероятно мощным для запросов, однако у меня есть несколько вопросов. Вот как я представляю, что база данных будет структурирована, но я могу ошибаться.

Filename1   Tag1-value  Tag2-value  ... Tag50000-value
Filename2   Tag1-value  Tag2-value  ... Tag50000-value
...
Filename300 Tag1-value  Tag2-value  ... Tag50000-value

У меня есть некоторый опыт работы с SQLAlchemy для Flask, но после моего предыдущего использования каждому значению базы данных потребовалось бы отдельное объявление в файле моделей моего приложения, которое кажется очень неэффективным для 50 000 характеристик. Можно ли ввести все эти данные в другую базу данных SQL и по-прежнему обращаться к ней в колбе?

Вот как я полагаю, что модель должна быть настроена, и при необходимости я бы выписал все 50 000 тегов, но я должен верить, что есть более простой способ сделать это.

class Dataset(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    filename = db.Column(db.String(64), index=True, unique=True)

    tag1 = db.Column(db.Boolean)    # or tag1 = db.Column(db.Integer)
    tag2 = db.Column(db.Boolean)    # or tag2 = db.Column(db.Integer)
    # ...
    tag50000 = db.Column(db.Boolean)    # or tag50000 = db.Column(db.Integer)

1 Ответ

0 голосов
/ 13 мая 2019

Вот мое текущее рабочее решение, не изящное, и может быть лучше оптимизированный способ. Две таблицы, первая для каждого «имени файла» и вторая для каждого тега.

Таблица 1:

FileId  ReferencetoTag

Таблица 2:

TagId   Value(0/1)  FileId(ForeignKey)
class Sample(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    # Sample_id and filename are synonymous
    Sample_id = db.Column(db.String(10), index=True, unique=True)
    tags = db.relationship('Tag', backref='name', lazy='dynamic')

    def __repr__(self):
        return '<File_id {}>'.format(self.File_id)


class Tag(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    tag_id = db.Column(db.String(20), index=True)

    value = db.Column(db.Boolean)
    sample_id = db.Column(db.Integer, db.ForeignKey('sample.id'))

    def __repr__(self):
        return '<Gene_id {}>'.format(self.gene_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...