Я делаю форму HTML, и мне нужно сохранить информацию о флажках в базе данных, но эта информация также должна быть доступна для поиска. Лучший возможный способ? - PullRequest
1 голос
/ 25 февраля 2011

Итак, я проектирую базу данных, и у меня есть объект под названием 'resources', который имеет стандартные атрибуты, такие как name, url, email, которые хорошо вписываются в схему базы данных (как varchars и текстовые типы данных). Однако эти ресурсы имеют другие атрибуты, которые должны быть представлены в форме HTML в виде флажков, то есть они могут принимать более одного значения в зависимости от количества отмеченных флажков, но также должны быть доступны для поиска. Фактически, в требованиях говорится, что большинство этих атрибутов ресурсов должны быть доступны для поиска, и это хорошо для типов столбцов varchar и text, но я не знаю, что делать с этими атрибутами, которые могут принимать более одного значения из набора значения (атрибуты представлены в виде флажков.)

Вот пример того, что я имею в виду:

Темы ресурсов

Пожалуйста, выберите темы для этого ресурса:

  • Переработка
  • Снижение
  • Многократное
  • Компостирование
  • Свалка

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

Кстати, я должен сделать это на PHP и MySQL. Итак, я попытался сериализовать флажки с помощью PHP и сохранить их как сериализованные строки, однако они не очень доступны для поиска, потому что я получаю противоречивые результаты, когда пишу запросы MySQL, которые пытаются сопоставить термины, используя «LIKE». Я подозреваю, что это связано с тем, как PHP сериализует массивы. Поэтому мне было интересно, есть ли лучший способ сделать это. Будет ли хранение данных в виде строк в кодировке JSON лучшим способом сделать это?

Любые предложения будут с благодарностью.

Ответы [ 4 ]

0 голосов
/ 25 февраля 2011

Если я правильно понимаю, у Ресурсной сущности может быть более одной темы (Переработка, Сокращение и т. Д.). Если так, то почему не существует отношение «многие ко многим» между Resource и Resource_topic? Таким образом, вы можете искать темы, которые помечены / принадлежат «Переработка», «Сокращение» или «Что угодно»

0 голосов
/ 25 февраля 2011

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

Select * from resource
Where name like '%' + @query + '%'
And (IsRecycling = 1 and 'recycling' like '%' + @query + '%')
[rest of your and statements will be identical to above and listed here]

Отказ от ответственности: этот код не тестировался, но здесь для демонстрации общей идеи.

0 голосов
/ 25 февраля 2011

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

Пример:

<?php
 $checkboxes = array ('Recycling',
                      'Reducing',
                      'Reusing',
                      'Composting',
                      'Landfill',
                       // etc.
                      );

 $string = ''; // the string that holds whether or not a checkbox is ticked
 foreach($checkboxes as $checkbox_id=>$checkbox_name)
     $string .= $_POST[$checkbox_name]?1:0;

 // example mySQL
 $update_query = "UPDATE `table` SET `checkbox_data` = '$string'";
 $select_query = "SELECT * FROM `table` WHERE SUBSTRING(`checkbox_data`,$checkbox_id,1) == 1"; 
?>

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

0 голосов
/ 25 февраля 2011

Я предлагаю один столбец для каждого флажка. Они могут иметь тип boolean, если вы выполняете отображение в своем php-коде.

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