Как реализовать эту логику в базе данных?


Вот такая ситуация: У меня есть "пользователь", у которого есть много атрибутов. Например, "имя", "электронная почта", "пароль", "телефон".

Есть некоторые атрибуты, которые открыты для публики, например, "имя", "электронная почта". Эта информация открыта даже для тех, кто посещает сайт.

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

И частный "пароль". Эта информация предназначена только для пользователя, другие люди не могут получить к ней доступ.

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

Я использую три числа, чтобы представить три уровня права. Первый - с 3, второй-с 2, а рядовой-с 1. Итак, я проектирую база данных таким образом:

User
id(PK) 
nameId(FK) 
emailId(FK) 
passwordId(FK) 
phoneId(FK)

Name:
id(PK)
name(String)
securityLevel(int)

Email:
id(PK)
email(String)
securityLevel(int)

Phone:
id(PK)
phone(int)
securityLevel(int)

Password:
id(PK)
password(String)
securityLevel(int) //It must be 1

Вопрос в том, что я могу это сделать, но в моей базе данных будет много таблиц, есть ли простой способ сделать это? Кроме того, есть ли какие-либо книги о таком виде проектирования баз данных рекомендуется? спасибо.

3 2

3 ответа:

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

Users:
id
name
name_perm // 1, 2 or 3
email
email_perm // 1, 2 or 3
phone
phone_perm // 1, 2 or 3
password // Doesn't need permissions, always 1

Friends:
user_id
friend_id

Когда пользователь посещает страницу другого пользователя, сначала вы проверяете уровень разрешений для каждого поля. Если уровень 2 найден, вы затем запросите таблицу friends и проверите, является ли текущий идентификатор пользователя друг пользователя, чья страница просматривается. Если он найден, пользователь является надежным и информация о безопасности уровня 2 может быть отображена. Что касается безопасности уровня 1, то это очень просто - отображать эту информацию только в том случае, если оба идентификатора совпадают.

Надеюсь, это поможет.

Для этого не нужны разные таблицы, потому что каждое отношение является отношением 1-1.

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

Независимо от того, выделяются ли личные данные в отдельную таблицу, вопрос о том, как предотвратить несанкционированный доступ, не решается. Руководство MySQL 5.1раздел 5.4.5 обсуждает проверку запроса/привилегии, но если ваша база данных скрыта за веб-приложением без прямого доступа к вашим таблицам, то стандартная безопасность веб-сервера сама по себе может быть достаточной. Вы, вероятно, должны упомянуть весь пакет os/server/db/language, который вы используете (LAMP, SAMP, что угодно), так что кто-то может предложить наилучшую схему безопасности для вашей конфигурации.