Как мне организовать эту информацию в SQLite?

#android #sqlite #android-sqlite

#Android #sqlite #android-sqlite

Вопрос:

Я создаю приложение и использую SQLite для базы данных, но я никогда не использовал класс базы данных.
Я пытаюсь выяснить, как организовать следующую информацию:

Класс пользователя: имеет имя, два целочисленных поля и СПИСОК групп,

Класс группы: имеет имя, двойное поле и СПИСОК пользователей

Пользователь также в конечном итоге должен будет иметь какое-то поле аутентификации (имя пользователя / пароль), но я планирую разобраться с этим позже.

Если бы вы могли помочь мне продумать, как организовать эту информацию в SQLite, это было бы здорово.

Комментарии:

1. Кстати, хранить пароли в виде открытого текста не рекомендуется. Я понимаю, что вы только учитесь, но если вы хотите сделать это «правильно», посмотрите, как не хранить пароли для краткого обзора.

Ответ №1:

Таблицы могут быть организованы следующим образом,

Таблица User_tbl

 --------------------------------------------------
_ID     int         primary key
--------------------------------------------------
name    text        name of user
--------------------------------------------------
field1  int         int field 1
--------------------------------------------------
field2  int         int field 2
--------------------------------------------------
 

Таблица Group_tbl

 --------------------------------------------------
_ID     int         primary key
--------------------------------------------------
name    text        name of group
--------------------------------------------------
field   double      double field
--------------------------------------------------
 

Согласно ответу @cricket_007s, вам нужна другая таблица, которая связывает оба этих поля,

Таблица User_groups_tbl

 --------------------------------------------------
_ID         int         primary key
--------------------------------------------------
user_id     int         _ID value from User_tbl
--------------------------------------------------
group_id    int         _ID value from Group_tbl
--------------------------------------------------
 

INNER JOIN Запрос типа,

 SELECT User_tbl._ID, User_tbl.name, Group_tbl._ID, Group_tbl.name, User_groups_tbl.user_id, User_groups_tbl.group_id
FROM User_tbl, Group_tbl, User_groups_tbl
INNER JOIN User_tbl.User_tbl._ID ON User_groups_tbl.User_groups_tbl.user_id
INNER JOIN Group_tbl.Group_tbl._ID ON User_groups_tbl.User_groups_tbl.group_id
WHERE User_groups_tbl.user_id = user_id;
 

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

Аналогично INNER JOIN запрос типа,

 SELECT User_tbl._ID, User_tbl.name, Group_tbl._ID, Group_tbl.name, User_groups_tbl.user_id, User_groups_tbl.group_id
FROM User_tbl, Group_tbl, User_groups_tbl
INNER JOIN User_tbl.User_tbl._ID ON User_groups_tbl.User_groups_tbl.user_id
INNER JOIN Group_tbl.Group_tbl._ID ON User_groups_tbl.User_groups_tbl.group_id
WHERE User_groups_tbl.group_id = group_id;
 

выдаст всех пользователей в группе a.

Объяснение для User_groups_tbl

Эта таблица используется для хранения many-to-many взаимосвязи между двумя таблицами User_tbl и Group_tbl . Когда пользователь добавляется в новую группу или наоборот, добавьте запись с _ID соответствующей группой и _ID соответствующим пользователем в этой таблице.

Комментарии:

1. Я думаю… Но это плохой дизайн. Как бы вы нашли информацию обо всех пользователях группы из списка, разделенного запятыми? Кроме разделения строки и запроса отдельных идентификаторов?

2. Думаю, потребуется работа. Могу ли я изменить в соответствии с вашим ответом?

3. @cricket_007 Пожалуйста, проверьте 🙂

4. Выглядит неплохо, хотя я бы добавил запрос ОБЪЕДИНЕНИЯ, чтобы получить все имена пользователей в группе

5. Меня немного смущает User_groups_tbl. Не могли бы вы привести мне пример того, как это использовать?

Ответ №2:

Насколько я понимаю, две таблицы образуют много-много отношений. Итак, «хороший» дизайн базы данных будет иметь 3 таблицы.

Таблица 1 (Пользователь): идентификатор пользователя (первичный ключ), имя, field_1, field_2

Таблица 2 (Группа): group_ID (первичный ключ), имя, double_Field

Таблица 3 (Взаимосвязь): user_ID (внешний ключ), group_ID (внешний ключ).

Ответ №3:

Если я правильно понял вопрос, вам нужно разобраться с many-many отношениями между пользователем и группой. С помощью SQLite действительно сложно обрабатывать такие отношения. Я рекомендую вам использовать ORM для этого Android, например Realm Android, который быстрее, чем sqlite, и идеально подходит для ваших нужд. Для многих-многих отношений создайте свои модели как https://realm.io/docs/java/latest/#many-to-many

Комментарии:

1. Итак, вы рекомендуете Realm поверх SQLite? Я думаю, это был лучший первоначальный вопрос. Может ли Realm также обрабатывать аутентификацию по имени пользователя / паролю позже?

2. Да, почему бы и нет? Я не пробовал это с Android . Но я использовал ORM для аутентификации в Интернете. Вам нужно сначала выполнить поиск имени пользователя, используя модель пользователя, а затем, если он найден, сопоставить пароль if(user.getPassword().equal(input_password)) с authenticate именем пользователя.

3. Отлично! Я изучу это.

Ответ №4:

Вы могли бы пойти в Codecademy и пройти курс SQL. Или вы можете использовать Realm или Cupboard или ActiveAndroid (есть несколько библиотек для облегчения разработки SQLite). И, если вы не знакомы с написанием кода SQL, то лучше всего использовать один из них.

В принципе, у вас будет таблица пользователей, таблица групп, затем таблица поиска группы пользователей (2 столбца), в которой перечислены значения идентификаторов, идентификаторы которых принадлежат идентификаторам группы.

Это можно рассматривать как отношение «многие ко многим«.