Можно ли хранить данные презентации в базе данных? - PullRequest
8 голосов
/ 28 апреля 2011

Я хочу отобразить строки из таблицы базы данных (SQL SERVER 2005) на веб-странице. Эти строки содержат statusID (внешний ключ), который дополнительно определяется таблицей Status (например, id, name ,ifiedDate).

Различные статусы должны отображаться по-разному (скажем, у них просто другой цвет фона).

Я использую php для запроса базы данных и построения таблицы веб-страниц. Когда я создаю таблицу, я собираюсь применить класс css к элементу на основе статуса этой строки.

У меня есть как минимум 2 варианта сделать это:

  1. Определите кодовую логику в php для ее обработки, и если статусы будут изменены в базе данных, мне придется изменить код.

  2. Сохраните «класс» в базе данных и просто примените класс, который был сохранен.

Последний вариант мне кажется лучше, но я не уверен, является ли встраивание презентационных данных в базу данных плохим выбором дизайна. Это будет основой, на которой я создаю несколько интранет-утилит, и я хотел бы начать с правой ноги.

Ответы [ 4 ]

4 голосов
/ 28 апреля 2011

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

Вы можете убедиться, что эти проблемы разделены, инкапсулировав данные для уровня презентации в свойствах объекта elementInfo (например).

Поскольку речь идет об CSS-классе, эти данные представления должны храниться отдельно от бизнес-данных . Поэтому, хотя в базе данных можно хранить как презентационные, так и бизнес-данные, их нельзя хранить в одной таблице.

Обновление re: comment Нет, вам не следует добавлять идентификатор PresentationClassRecord в качестве FK для бизнес-объекта. Я сделал пример подхода к БД ниже. Я назвал DummyTable ваши бизнес-объекты, а остальное следует спецификации. Самая важная часть - StatusPresentationAssignmentTable

 -----------------------------------------------
 DummyTable
 -----------------------------------------------
 Id      Name     SomeOtherDataField    StatusId
 PK int  varchar  int                   FK int

 -----------------------------------------------
 StatusTable
 -----------------------------------------------
 Id      Name     ModifiedDate
 PK int  varchar  datetime

 -----------------------------------------------
 PresentationTable
 -----------------------------------------------
 Id      PresentationType    Value 
 PK int  varchar            
 sample data:
 43      CssClass            prettyBackground

 -----------------------------------------------
 StatusPresentationAssignmentTable
 -----------------------------------------------
 StatusId    PresentationId 
 FK int      FK int

Теперь с помощью двух простых предложений объединения вы можете получить данные презентации, и они полностью отделены от ваших бизнес-данных. Ваш сценарий может сделать что-то вроде проверки, есть ли в статусе манекена какие-либо назначения для презентации. Если это так, то он просматривает PresentationType, получает соответствующую функцию для применения данных презентации к презентации и выполняет ее. (Вам необходимо иметь функцию для каждого PresentationType, которая знает, как обрабатывать значение - что-то, что может быть инкапсулировано чем-то вроде function applyPresentationValue(presentationElement, presentationType, presentationValue), которое вызывает другую функцию applyCssClass(presentationElement, value), если presentationType == "CssClass").

4 голосов
/ 28 апреля 2011

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

Когда вы комбинируете этот класс с заданным набором стилей, , а затем это презентационная информация. И вы будете делать это в своем файле CSS, а не в базе данных.

Однако вариант 1 не обязательно требует от вас изменения кода PHP, если статусы в базе данных изменяются. Ваш PHP может просто сгенерировать имя класса из id или name статуса. Ваш CSS должен был бы измениться, если бы изменились идентификатор / имя статуса, но возможно ли это? Разве каждый статус не должен оставаться постоянным с добавлением новых статусов, если есть изменения в статусах, которые приложение должно представлять?

3 голосов
/ 28 апреля 2011

Хотя вы можете хранить информацию о классе CSS в базе данных, многие системы управления контентом делают это, но вам лучше всего сделать статус частью имени класса.

т.е. status = open, closed использовать php logicчтобы сгенерировать строки таблицы и установить класс css в status_ {name}, тогда каждый раз, когда вы добавляете новый статус или переименовываете его, вам нужно только добавить / отредактировать файл css, не требуется перекодирование php.

.status_open{background-color:green;}

.status_closed{background-color:red;}

1 голос
/ 28 апреля 2011

Я вижу преимущества и недостатки для хранения этого в БД.Очевидно, что там удобно иметь информацию о классе, но она не является частью приложения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...