2013-07-16 3 views
0

У меня есть опрос, у которого есть неопределенное количество параметров (у него может быть только 2 варианта, но он также может иметь 10 или 20 или более вариантов на выбор). Мне нужно сохранить текущий подсчет голосов в таблице MySQL. Я не могу думать о централизованном способе их хранения, кроме: Создайте поле vote_count и сохраните сериализованный массив вариантов голосования, сопоставленных с подсчетами. Когда данные нового голосования поступают в это поле, считываются, неэтериализованы, соответствующие значения увеличиваются, а затем записывается поле. Для этого требуется 2 запроса, и может быть 5 или более голосов, поступающих в секунду.Сохранение нескольких вариантов голосования в таблице MySQL

Так что мне нужен способ хранения подсчета голосов для неизвестного количества вариантов голосования и быстрого доступа к нему (мне нужно обновлять счет за каждый параметр, отображаемый на странице голосования) и быстро обновлять его (когда новый голосов). Он должен находиться в таблице MySQL. Не существует «верхнего» предела для количества вариантов голосования.

+0

Можете ли вы предоставить некоторые примеры данных, чтобы лучше проиллюстрировать вопрос? –

+0

@GordonLinoff, решение является принятым ответом. Представьте, что у меня есть два опроса: «Согласны ли вы: да | нет' и 'Вы не согласны: да | нет | возможно, 'Теперь мне нужно хранить подсчеты для каждой опции в таблице MySQL. Я не могу просто создать поле для «да», «нет» и «возможно», потому что не каждый опрос использует все их, и может быть 30 или 40 опций, которые еще не являются полями, а это значит, что мне нужно каждый раз менять таблицу создается новый опрос. – Xeos

ответ

2

Нормативный шаблон для обработки многозначных атрибутов или повторяющихся значений заключается в добавлении второй таблицы.

Рассмотрите заявку на покупку, которая может иметь более одной позиции на нем. Мы представляем позиции в дочерней таблице с внешним ключом к родителю в таблице заказа на поставку:

CREATE TABLE `purchase_order` (id int not null, foo varchar(200), ...); 
CREATE TABLE `line_item` (id int not null, order_id int not null, ...); 
ALTER TABLE `line_item` ADD FOREIGN KEY (order_id) REFERENCES order(id) ; 


INSERT INTO purchase_order (id, foo) VALUES (101, 'bar'); 

INSERT INTO purchase_order (id, order_id) VALUES (783, 101); 
INSERT INTO purchase_order (id, order_id) VALUES (784, 101); 
INSERT INTO purchase_order (id, order_id) VALUES (785, 101); 

Мы можем получить количество отдельных позиций, связанных с заказом на поставку, как это:

SELECT COUNT(1) 
    FROM line_item 
WHERE order_id = 101; 

Или, мы можем получить количество позиций для каждого заказа на поставку, как это:

SELECT o.id, COUNT(l.id) AS count_line_itesm 
    FROM purchase_order o 
    LEFT 
    JOIN line_item l 
    ON l.order_id = o.id 
GROUP BY o.id 

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

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

poll - 
poll_question - a single question on a given poll 
poll_question_answer - a possible answer to a question to a given poll question 
voter - 
ballot - associated with one voter and one poll (?) 
vote - the answer given to a particular poll question 

Хороший дизайн базы данных происходит от понимания сущностей и отношений и разработки подходящей модели.

+0

Спасибо. Это то, что я буду делать. Есть таблица с только вариантами ответа для опроса evry. – Xeos

2

У вас не может быть только одна таблица вопросов и другая таблица возможных ответов (несколько строк на вопрос, сколько хотите). Затем либо храните подсчеты в таблице ответов, либо (лучше), есть другая таблица фактических введенных ответов (таким образом вы можете регистрировать сведения о человеке, выполняющем ответы, и легко использовать SUM/COUNT для определения количества голосов каждый опция есть).

+0

Да. Иду это сделать. Спенсер ответил первым, хотя .. Но спасибо в любом случае. – Xeos

+0

+1. Это подход, который я бы взял, родительскую таблицу и дочернюю таблицу с внешним ключом. – spencer7593

+0

Нет проблем, хотя, кажется, я туда попал ;-) – Kickstart

Смежные вопросы