Группировка пользовательских атрибутов в запросе

У меня есть приложение, которое позволяет полностью настраивать «контакты». Мой способ сделать это — позволить администратору настроить все поля, разрешенные для контакта. Моя база данных выглядит следующим образом:

Контакты

  • id
  • активный
  • Последнее посещение
  • создано на

Поля

  • id
  • метка

FieldValues

  • id
  • идентификатор поля
  • контактид
  • отклик

Таким образом, таблица контактов сообщает только о том, активны ли они и их идентификатор; таблицы полей содержат только метку поля и идентификатор, а таблица значений полей — это то, что фактически содержит данные для контактов (имя, адрес и т. д.)

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

Калифорния (из таблицы полей)

  • Коста-Меса - (из таблицы полей) 5 - (учитывается в таблице значений полей)
  • Ньюпорт 2

Коннектикут

  • Уоллингфорд 2
  • Клинтон 2
  • Берлин 5

Поле состояния может иметь идентификатор 6, а поле города может иметь идентификатор 4. Я не знаю, долго ли я смотрел на этот код, чтобы понять его, или что,

SQL для создания этих трех таблиц можно найти по адресу https://s3.amazonaws.com/davejlong/Contact.sql


person Dave Long    schedule 03.03.2011    source источник
comment
Какое место в вашей схеме занимают поля «штат» и «город»?   -  person Todd Sharp    schedule 03.03.2011
comment
Поля штата и города поместятся в таблицу полей, а их значения будут в таблице значений полей.   -  person Dave Long    schedule 03.03.2011
comment
Я с трудом представляю схему. Можете ли вы предоставить мне короткий скрипт для воссоздания некоторых данных? Я уверен, что могу помочь.   -  person Todd Sharp    schedule 03.03.2011


Ответы (1)


У вас есть модель значение атрибута объекта (EAV). Используйте таблицы field и fieldvalue только для поиска - оператор WHERE. Затем упростите жизнь, сохранив полные данные объекта в CLOB вне основной таблицы (например, Contacts.data) в сериализованном формате (для этого подходит WDDX). Прочитайте столбец data, десериализуйте и работайте с ним на стороне сервера. Это намного проще, чем множество объединений, которые вам пришлось бы выполнять в противном случае, чтобы воспроизвести полностью гидратированный объект из установки EAV.

person orangepips    schedule 03.03.2011
comment
Я не собирался этого делать, но это было бы лучшим решением проблемы. Я нашел способ собрать вещи вместе, чтобы выполнить работу, пока я не переделаю базу данных. У меня просто сейчас нет времени. Я не буду публиковать свой ответ, как я уже сказал, взламывая все вместе. - person Dave Long; 07.03.2011