Помощь по схеме базы данных

183
08 мая 2018, 00:48

Есть сайт где пользователь может задавать вопросы другим пользователям (одному или нескольким). У меня есть таблыцы: пользователи-tb_users и вопросы-tb_question, теперь как мне как мне хранить данные о том, какой пользователь каким-(ому) пользователям-(ю) задаёт вопрос.

Answer 1

В том виде в котором вы задали вопрос ответ будет следующим.

Вам нужна дополнительная таблица tb_recipients с двумя полями - id_question и id_recipient (foreign key к question и users соответственно).

Допустим, вам нужно вопросу с id = 18 дать видимость пользователям с id = 3, 4 и 5. В этом случае вы в таблицу tb_recipients вносите три записи: (18, 3), (18, 4) и (18, 5)

За кадром вы оставили вопрос. А сайт будет только сайтом, на котором каждый вопрос виден только ограниченному кругу лиц? Это каждый раз нужно будет указывать кому виден вопрос, неудобно.

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

И если вдруг вы задумаетесь добавить на сайте возможность задавать вопросы публичные, с видимостью "неограниченному кругу лиц" - то тоже нужно будет допиливать схему. Например, создать дополнительное поле на вопросе boolean поле is_public, чтобы понимать учитывать ли данные в таблице tb_recipients.

А, что если вместо id_user я буду добавлять username(varchar20). Это никак не повлияет на производительность?

Так не делают. Принято в запросах на выборку делать INNER JOIN и получать имя пользователя. А в таблицах хранят int'товые идентификаторы. Join по int намного более производительная операция, чем join по строке.

Иногда (в высокопроизводительных системах) могут продублировать поле username, чтобы ещё больше выиграть в производительности некоторых операций. Но на вашем уровне понимания SQL лучше всего хранить данные в третьей нормальной форме, а когда уже научитесь - можете для общего развития почитать про денормализацию в highload'е.

READ ALSO
select is not valid input at this position MySQL 8

select is not valid input at this position MySQL 8

Подскажите в чем ошибка

234
MySql error 1452

MySql error 1452

Возникает ошибка номер 1452Как можно исправить?

195
Не могу убрать черный фон с мапы

Не могу убрать черный фон с мапы

Не могу убрать черный фон с мапыПробывал в настройках увеличить поле, но не помогает(крысным я показал)

187