Как реализовать эту логику в базе данных? - PullRequest
2 голосов
/ 06 июля 2010

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

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

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

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

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

Я использую три числа, чтобы представить три уровня права.Первый с 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 ]

1 голос
/ 06 июля 2010

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

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

0 голосов
/ 06 июля 2010

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

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, это действительно просто - отображать эту информацию, только если оба идентификатора совпадают.

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

0 голосов
/ 06 июля 2010

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

...