Поворотная концепция - PullRequest
1 голос
/ 04 апреля 2009

Hiii,

У меня есть дизайн базы данных как:

Table File (FileID, Name, Details)

Table Attributes (AttID, AttName, AttType)

Table AttValues (FileID, AttID, AttValue)

До времени выполнения неизвестно, сколько Attributes содержится в File и каких имен.

И я хочу отобразить после вставки в Frontend таким образом, как:

FileID, FileName, Details, (Rows of Attribute Table as Column here).

т.е., Кто-нибудь может предоставить мне кусок кода на Java или в MySQL для достижения этого результата разворота.

Большое спасибо за ваше драгоценное время.

Или есть какой-то другой способ хранения данных, чтобы я мог легко получить желаемый результат.

Ответы [ 2 ]

1 голос
/ 04 апреля 2009

Я недавно ответил на похожий вопрос: Как развернуть схему значения-атрибута сущности MySQL . Ответ зависит от MySQL, но я думаю, это нормально, так как вопрос помечен как mysql.

1 голос
/ 04 апреля 2009

Для этого требуется два запроса. Сначала выберите File:

SELECT * FROM File WHERE (...)

Затем получите Attributes:

SELECT *
FROM AttValues
     JOIN Attributes ON (Attributes.AttId = AttValues.AttId)
WHERE FileId = $id

Последний запрос предоставит вам одну строку на Attribute, которую вы можете программно развернуть для отображения на вашем веб-интерфейсе:

foreach(row in result) {
    table.AddColumn(Header = row['AttName'], Value = row['AttValue']);
}

При необходимости адаптируйтесь к локальной среде программирования.


Конечно, это работает только для одиночных File или File с одинаковыми атрибутами. Если вы хотите отобразить несколько файлов с разными Attributes, вместо этого вы можете предварительно выбрать все AttName s:

SELECT Attributes.AttId, Attributes.AttName
FROM Attributes 
     JOIN AttValues ON (Attributes.AttId = AttValues.AttId)
WHERE FileId IN ( $list_of_ids )

Затем загрузите значения следующим образом:

SELECT *
    FROM AttValues
WHERE FileId IN ( $list_of_ids )

и использовать локальный ассоциативный массив для сопоставления AttId s с индексами столбцов.

В качестве окончательной оптимизации вы можете объединить два последних запроса в OUTER JOIN, чтобы избежать третьего обхода. Хотя это, вероятно, увеличит объем передаваемых данных, это также упростит заполнение таблицы, если ваша библиотека классов поддерживает именованные столбцы.

...