Разделите SQL данных в разных таблицах - PullRequest
1 голос
/ 04 марта 2020

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

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

Должен ли я хранить один и тот же идентификатор пользователя в каждой таблице во время регистрации? Разве это не создает ненужные дубликаты?

РЕДАКТИРОВАТЬ: пример

таблица:

| id | user | email | phone number| password | followers | following | likes | posts |

становится

таблица 1:

| id | user | email | phone number| password |

Таблица 2:

| id | followers num | following num | likes num | posts num |

Ответы [ 4 ]

1 голос
/ 04 марта 2020

Это выглядит как "проблема XY".

Вы хотите "не иметь огромную таблицу". Но почему почему у вас есть это требование?

Возможно, это потому, что некоторые ответы в некоторые сценарий ios медленнее, чем вы ожидаете .

Вместо того, чтобы разбивать таблицы в разные стороны, что, как упоминал Гордон Линофф, является SQL антипаттерном и может оставить вас в беде больше, чем прежде, вам следует контролировать вашу систему и измерять производительность различных запросов, которые вы используете, взвешивая их по частоте. То есть, если запрос № 1 выполняется сто тысяч раз за период и занимает 0,2 секунды, то это 20 000 секунд, и вы должны записать его на запрос № 1. Запрос № 2, который занимает в пятьдесят раз больше - десять полных секунд - но выполняется только сто раз, будет составлять только одну двадцатую от общего времени первого.

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

Как бы то ни было, если вы знаете , какие запросов вы должны оптимизировать в первую очередь, , а затем , вы можете приступить к оптимизации вашей схемы.

Первое, что нужно проверить, это индексы. И возможно нормализация. Они охватывают добрые две трети «малоэффективных» дел, с которыми я встречался до сих пор.

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

Тогда есть неосторожные СОЕДИНЕНИЯ и ПОДБОРЫ. Обычно они начинаются с малого и быстро, поэтому никто не мешает проверить индексы, нормализацию или условия на них. Через пару лет внутренний SELECT собирает миллион записей, а внешний JOIN отбрасывает девятьсот девяносто девять тысяч из них. Переведите условие отмены в подвыбор и посмотрите, как запрос взлетает.

Затем вы можете проверить, действительно ли к какой-то информации обращаются редко (например, у меня есть одна БД, где у каждого пользователя есть куча финансовой информации, но это необходимо только в 0,1% запросов. Так что в этом случае да, я разделил эту информацию во вторичной таблице, также получив возможность поддержки пользователей с несколькими банковскими счетами, зарегистрированными в системе. Это не было почему я это сделал, учтите).

Во всем этом также учитывают время и деньги. Выполнение анализа, запуск модификаций и проверка их , а также любое время простоя, будет стоить чего-то и, возможно, даже увеличит затраты на обслуживание. Возможно - просто возможно - выбрасывание меньшего количества денег, чем это, на более быстрый диск или больший объем ОЗУ или более или более быстрых процессоров может привести к тем же улучшениям без необходимости изменять схему или базу кода.

0 голосов
/ 11 марта 2020

Одна таблица, вероятно, будет иметь AUTO_INCREMENT для PRIMARY KEY; другая таблица будет иметь идентичный PK, но это не будет AUTO_INCREMENT. JOINing таблицы будут собирать таблицы "вместе" для запросов.

Редко веская причина для "вертикального разбиения" таблицы. Одним из редких случаев является выделение «like_count» или «view_count». Таким образом, основной стол не будет беспокоить непрерывные UPDATEing счетчиков. В некоторых крайних случаях это может помочь производительности.

0 голосов
/ 04 марта 2020

Я думаю, что вы хотите использовать LEFT JOIN

SELECT t1.[user], t2.[posts]
FROM Table1 AS t1
LEFT JOIN Table2 AS t2 ON t1.id= t2.id

РЕДАКТИРОВАТЬ: Вот ссылка на документацию, которая объясняет различные типы JOINS

0 голосов
/ 04 марта 2020

Мне кажется, я понимаю ваш вопрос, и если вам интересно, вы можете использовать внешний ключ. Когда у вас есть список пользователей, убедитесь, что у каждого пользователя есть определенный c идентификатор.

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

Затем, когда вам нужно извлечь данные для этого конкретного пользователя c из этой другой таблицы / таблиц, вы можете просто выбрать из таблицы, где id = session [id] или get [ id]

это помогает?

ответ: используйте внешний ключ для идентификации пользовательских данных с использованием get и сеансов

не беспокойтесь о дубликатах, если вы удаляете эти значения из основной таблицы.

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