Резиновая таблица с неограниченным количеством полей.

Bermuda

Новичок
Резиновая таблица с неограниченным количеством полей.

Задача: создать систему почтовой рассылки.

Имеются группы рассылки. С каждой группой рассылки связано некоторое количество записей. Каждая запись имеет следующие поля:
- email
- имя
- фамилия
и еще N полей.
Система должна быть универсальной. Одна из возможностей - почтовая рассылка с использованием шаблонов. В шаблоны парсятся данные из базы. Данные в базу данных можно добалять из следующих источников.
- CSV файл
- таблица базы данных
- существующая группа рассылки
- вручную

Проблема: невозможно знать заранее какие поля и сколько полей понадобится в базе данных для хранения.

Примеры.
случай а)
- email
- имя
- фамилия

случай б)
- email
- дата рождения
- дата регистрации
- марка машины

случай в)
- email
- статус
- телефон
- пол
- возраст

Т. е. в принципе для каждой группы рассылки количество полей, их тип и имена в общем случае разные.
Варианты:
- Создавать для каждой группы рассылки новую таблицу -- решение довольно прозрачное, но не подходит так как абсолютно неверное.
- Создать таблицу со всеми возможными полями -- не годится, как результат перегрузка интерфеса пользователя и нерациональное использование БД.
- Добавлять/удалять поля "на лету" - не годится.

Таким образом положение спасает некоторая абстрактная "резиновая" таблица с неограниченным количеством полей.

Как реализовать на практике такую таблицу?
 

su1d

Старожил PHPClubа
завести таблицу дескрипторов полей
и таблицу связей many-to-many для объединения дескрипторов в некие наборы - виртуальные типа таблицы.
 

Crazy

Developer
Re: Резиновая таблица с неограниченным количеством полей.

Автор оригинала: Bermuda
Как реализовать на практике такую таблицу?
Купи книжку начального уровня про проектирование структуры БД, прочитай там про третью нормальную форму и приведи к ней свою структуру.
 

Bermuda

Новичок
Автор оригинала: su1d
завести таблицу дескрипторов полей
и таблицу связей many-to-many для объединения дескрипторов в некие наборы - виртуальные типа таблицы.
Это понятно, но требуется это сделать прозрачным для конечного пользователя. Не заставлять же секретаршу вникать в теорию баз данных.
 

su1d

Старожил PHPClubа
Это понятно, но требуется это сделать прозрачным для конечного пользователя. Не заставлять же секретаршу вникать в теорию баз данных.
делаешь просто "Конструктор записей", в котором будешь создавать "Описатель товара Х", где уже будешь заводить поля, указывать их тип и т.п.
когда-то я такое реализовал -- оч удобно получилось. думаю, что даже б секретарши разобрались. самое главное в этой задаче -- интерфейс хорошо продумать, а всё остальное -- фигня. =)
 

Bermuda

Новичок
Автор оригинала: su1d
"Описатель товара Х", где уже будешь заводить поля, указывать их тип и т.п.
Не пойдет. Люди не имеют понятия о полях и типах. Люди лишь знают, что у человека есть имя, фамилия, еще может быть телефон. Никого не интересует техническая сторона. Человек видит таблицу со строками и столбцами и хочет разослать, например, рекламное предложение используя определенный шаблон письма. Вставив в нужные места имя из столбца "имя", фамилия из столбца "фамилия" и марку автомобиля из столбца "марка автомобиля".

З.Ы. На всякий случай, чтобы не повесили на меня ярлык спамера -- рассылка для членов крупного автомобильного клуба.
 

Demiurg

Guest
Bermuda, это все реализуется. Пусть операторы вводят название поля и его тип (число или строка). а тызаведешь 4 таблицы
1.пользователи

2.поля

3. текстовые данные
ссылка на пользователя
ссылка на поле
значение(строка)

4. целочисленые данные данные
ссылка на пользователя
ссылка на поле
значение(число)
 

Bermuda

Новичок
Более-менее правильное решение я нашел.
Возвращаясь к условию:

Есть группа.
В группе есть записи.
Для каждой группы свой набор полей для записей.

Таблица групп рассылки:
- id
- имя
- описание

Таблица адресов рассылки:
- id группы
- адрес

Таблица связи групп и полей для записи
Описывает набор полей входящих в данную группу
- id группы
- имя "таблицы-поля"

N таблиц типа "поле"
Таблица являющаяся "полем" для группы
- id адреса рассылки
- значение

Таким образом создание "нового поля" сводится к созданию новой таблицы.
 

Demiurg

Guest
Может все же почитаешь то, что я тебе дал ?
 
Сверху