Синтаксис SQL для объединения нескольких таблиц - PullRequest
2 голосов
/ 28 февраля 2010

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

Полагаю, вы могли бы иметь одну отдельную таблицу для каждого типа и использовать что-то вроде FULL OUTER JOIN (имитируемое как sqlite это не поддерживает) и сортировать по дате Но это будет сложно, потому что мне все еще нужно иметь уникальные идентификаторы для всех таблиц.

Может быть, иметь основной список с идентификатором и датой, а затем JOIN в таблицах типов? Но насколько плоха производительность при использовании sqlite? Мне действительно нравится избегать супер таблицы, содержащей столбцы, которые могут понадобиться всем комбинированным типам.

А идеи?

Ответы [ 3 ]

1 голос
/ 28 февраля 2010

Вы должны попытаться построить и посмотреть, какую производительность вы получите.
SQLite - действительно быстрый движок, на мобильных устройствах флеш-память работает медленнее. Но даже с десятью тысячами записей вы получаете быстрые запросы.

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

1 голос
/ 28 февраля 2010

Для сопоставления иерархий классов с таблицами реляционной базы данных мне известны три шаблона:

  1. Одна таблица для всей иерархии. Каждая строка будет содержать объединение всех атрибутов классов иерархии. Это, на мой взгляд, трудно поддерживать, если есть изменения в классах. Конечно, каждой строке нужен идентификатор типа.
  2. Одна таблица для каждого конкретного класса иерархии. В этом случае таблица, представляющая конкретный класс, содержит атрибуты этого класса плюс атрибуты всех абстрактных базовых классов. Абстрактные классы не отображаются напрямую.
  3. Одна таблица для каждого абстрактного и конкретного класса. В этом случае каждый отдельный класс напрямую отображается в одну таблицу.

Преимущество 1. состоит в том, что довольно легко достичь того, что вы хотите сделать, то есть прочитать все объекты, которые являются частью вашей иерархии классов. Ты тратишь немного места, хотя. В 2. вы могли читать каждую таблицу в подвыборе одного оператора select с постоянными фиктивными значениями для атрибутов других классов, а затем объединять их вместе в одном операторе SQL. В 3. запрос становится немного более сложным: вам нужно ВНУТРИ СОЕДИНИТЬ таблицы конкретных классов с таблицами базовых классов в подвыборах. В любом случае вам не понадобится ПОЛНОЕ НАРУЖНОЕ СОЕДИНЕНИЕ.


Добавление:

Предположим, у вас есть иерархия объектов с классом Person и двумя подклассами, Student и Teacher. В 2. вы бы создали две таблицы, STUDENT и TEACHER, в каждой из которых есть столбец NAME. В таблице STUDENT есть дополнительный столбец YEAR, а в таблице TEACHER - столбец SALARY. Ваш запрос может выглядеть так:

    SELECT 'STUDENT' AS TYPE, NAME, YEAR, NULL AS SALARY FROM STUDENT 
UNION SELECT 'TEACHER' AS TYPE, NAME, NULL AS YEAR, SALARY FROM TEACHER

, который вы можете затем извлечь и использовать для заполнения ваших объектов данными или отображения, используя SimpleCursorAdapter или что угодно.

0 голосов
/ 28 февраля 2010

Это то, что вы хотите сделать в базе данных? Я предполагаю, что в коде вы отображаете данные в различные типы объектов (например, class Video, class Image ...), чтобы вы могли комбинировать данные и там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...