расширенный EAV с податрибутами в значении - PullRequest
0 голосов
/ 08 января 2012

Таблицы базы данных Entity-Attribute-Value представляют собой гибкий способ сохранения свойств пользовательских объектов.

Для моего проекта я должен пойти дальше: мне нужно не только хранить фиксированные значения объектов, но и хранитьзначения меняются с течением времени.

Как длина растущего человека:

  • Сущность: Питер
  • Атрибут: Длина
  • Значение: 160 см в 1-1-2010, 170 см в 1-1-2011

Это было бы легко решить, добавив еще один столбец под названием "время".

Но идея в том,чтобы быть еще более масштабируемым, например, так:

  • Объект: видео
  • Атрибут: тег
  • Значение: Питер в XY (100,200) в 0:20в XY (200 300) в 0: 30

Так что теперь значение не только имеет время, но и координаты как дополнительные податрибуты.Я хочу иметь возможность обрабатывать такие податрибуты.

Вопрос в том, существует ли какая-либо в конечном итоге масштабируемая известная модель для этого?(Так что мне не нужно заново изобретать колесо)

Или я должен просто использовать объект-оболочку вокруг объекта в значении?

1 Ответ

0 голосов
/ 08 января 2012

Похоже, вы говорите, что время и координаты применяются к всем ваших атрибутов eav.

В этом случае кажется, что идеальным решением было бы просто добавить time и coordinates (или x и y отдельно) в вашу таблицу eav.

Вся причина в eav - это когда у вас потенциально неограниченное количество атрибутов.Но если есть некоторые атрибуты, которые будут супер атрибутами, которые применяются ко всем остальным, нет причин не расширять эту таблицу eav.

например,

id | entity_id | attribute  |  value  |  time    |  coordinates
1  |  25       | tag        |  funny  | 12/12/12 | 200,300
1  |  25       | tag        |  funny  | 12/13/12 | 0,1

Затем вы можете выполнить запрос, подобный следующему:

SELECT `coordinates` FROM `my_table` WHERE `entity_id` = 25 ORDER BY `time` ASC

Результатом будет набор координат, которые вы затем сможете построить на графике или как угодно, относящиеся к конкретной сущности.

ИлиВы можете сделать:

SELECT `entity_id`, GROUP_CONCAT(CONCAT(`time`,'|',`coordinates`) ORDER BY `time` ASC SEPARATOR '~') as `time_coords` FROM `my_table` WHERE `entity_id` BETWEEN 25 AND 50 ORDER BY `entity_id`

Это даст вам такой результат

entity_id |временные координаты 25 |12.12.12 | 200,300 ~ 12/13/12 | 0,1 26 |12/12/12 | 150,99 ~ 12/29/12 | 151,180 ~ 12/30/12 | 60,60

Затем можно использовать PHP (или любой другой) для анализа результата по entity_id.

Например (после возврата результата запроса)

while($row = mysql_fetch_row($result)) {
  $id = $row[0];
  $time_coords = explode('~',$row[1]);
  foreach($time_coords as $time_coord) {
    $temp = explode('|',$time_coord);
    $time = $time_coord[0];
    $coord = $time_coord[1];
    // do stuff with $id, and each $time+$coord for that id
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...