я в начале полного рестайлинга моего веб-приложения, и у меня есть некоторые сомнения относительно хорошего дизайна базы данных, который может быть надежным, быстродействующим и в то же время полностью настраиваемым пользователями (пользователи не настроить структуру базы данных, но функциональность приложения).
Итак, моя настоящая ситуация, например, простая таблица пользователя:
id | name | surname | nickname | email | phone
1 | foo | bar | foobar | foo@bar.com | 99999
Вот так.
Но, скажем, один из моих клиентов хотел бы иметь 2 адреса электронной почты или номера телефонов для одного конкретного пользователя.
До сих пор я решал эту проблему, просто добавляя столбцы в таблицу пользователей:
id | name | surname | nickname | email | phone | email_two | phone_two
1 | foo | bar | foobar | foo@bar.com | 99999 | foo@bar.net | 999998
Но я не могу использовать этот способ с версией нового приложения. После этого мне хотелось бы пить мохито, не нравится призыв заказчика изменить структуру:)
Итак, я подумал, что решение, в котором люди могут определить таможенное поле, просто с помощью другой таблицы:
id | table_refer | type_field | id_object | value
1 | users | phone | 1 | 999998
2 | users | email | 1 | foo@bar.net
сохранение таблицы пользователей без изменений.
Но у этого способа есть 2 проблемы:
- Насколько я знаю, нет возможности использовать чужой ключ таким образом, что, если я автоматически удаляю 1 пользователя, внешний ключ удаляет в каскаде все строки во второй таблице, которые имеют значение 'table_refer' = users и id_object = users.id. Конечно, я могу использовать некоторые функции триггеров, но я потеряю часть надежности.
- Когда мне нужно будет выполнить запрос к базе данных, прежде чем получить пользователей, которые соответствуют 'foo@bar.net', мне нужно будет также проверить все ... hem .. option_table, и это сделает мой код сложный, менее надежный и запутанный со многими объединениями ... при условии, что таблица пользователей не будет единственной, "расширенной" опцией "option_table", кажется серым.
Моя цель - позволить своим клиентам добавлять столько настраиваемых полей, сколько им нужно, почти для всего объекта в приложении (пользователей, элементов, счетов, просмотров печати, фотографий, новостей и т. Д.), Предполагая, что большинство из этих таблиц будут разделены (разделены на 2 таблицы, с 3 таблицами и иерархией наследования).
Вы думаете, что мой путь может быть хорошим, вы знаете что-то другое лучше, или я в большой ошибке?
Пожалуйста, все предложения сейчас золотые!
РЕДАКТИРОВАТЬ :
То, что я ищу, может быть упрощено с помощью «статей-пользовательских полей» в блогах WordPress.
Моя цель - дать пользователю возможность определять новые поля, которые ему нужны, например, если моя таблица пользователей соответствует приведенной выше таблице, а клиенту нужно поле, которое я не могу предотвратить, например, URL-адрес веб-сайта, он должен иметь возможность добавьте его динамически, без редактирования структуры базы данных, а только с данными.
Я думаю, что таблица 2 ° (maibe 1 для каждого объекта) может быть хорошим решением, но я все еще жду лучших путей!