2010-06-21 2 views
2

У меня есть таблица пользователей и таблица вопросов. В таблице вопросов будут содержаться записи, которые представляют «Вопросы», «Ответы» и «Комментарии» на вопросы или ответы. Я хотел бы создать панель для каждого пользователя, в которой можно увидеть действия, связанные с вопросами и ответами. Например, если пользователь A создает вопрос, а пользователь B отвечает ответом, а пользователь C отвечает комментарием к ответу пользователя B, то пользователи A и B могут видеть все эти действия в своих информационных панелях.Создание сети подачи

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

Может ли кто-нибудь предложить простой способ смоделировать это в базе данных?

+1

Вы ещё не пробовали модель? У вас больше шансов получить конструктивные ответы, если вы попросите о помощи с конкретной проблемой, а не попросите группу незнакомых людей разработать вашу систему для вас ... –

ответ

2

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

+0

Я пробовал что-то очень похожее на ваше предложение, в котором у меня есть таблицу обновлений. Каждая строка связана с пользователем (лицо, действие которого привело к созданию записи в таблице обновлений) и описание действия. Это хорошо работает, когда я хочу найти действия, предпринятые людьми, которых я придерживаюсь, потому что я могу запросить их идентификаторы. Но я не могу найти чистый способ также получить связанные действия, которые могли быть сделаны пользователями, которых я не соблюдаю. Я стараюсь, чтобы это было максимально простым, чтобы избежать необходимости присоединяться к другим таблицам или выполнять несколько запросов. Любые мысли помогут :) – Roman

0

Хорошо, вот что вы можете попробовать .. вы не можете вмешиваться в вопросы, ответы и их комментарии в одной таблице. Один вопрос может иметь много ответов, а разные ответы могут иметь разные комментарии. Хранение всех их в одной таблице будет довольно беспорядочным и не рекомендуется (по сравнению с правилами РСУБД). Сделайте три отдельных таблицы один для Вопросов, один для ответов и один для комментариев. Определите отношения между ними на основе первичных и внешних ключей. Поэтому в любой момент времени в таблице вопросов у вас есть все вопросы, заданные всеми пользователями. В таблице ответов будут указаны все ответы, соответствующие этому конкретному вопросу, и в таблице комментариев будут представлены комментарии к соответствующему ответу. Поддержание надлежащих опорных столбцов во всех таблицах позволяет легко управлять тем, что вы хотите. В любой момент времени вы можете увидеть все ответы, связанные с конкретным вопросом, присоединившись к таблице «Вопрос и ответ», также вы можете просмотреть все комментарии, сделанные по конкретному ответу, присоединившись к таблице «Ответ и комментарий».

Надеюсь, что это даст вы IDEA ..

+0

Я знаю методы дизайна схемы учебников, однако производительность была серьезной проблемой. С моей текущей системой я могу перечислить вопрос вместе с его ответами и комментариями с помощью единого запроса на соединение. ИМО, ваше предложение приятно с точки зрения традиционной схемы, но в реальных ситуациях иногда оптимизации, такие как описанные мной, дают большие дивиденды. – Roman

+0

true, но управление в одной таблице будет отлично работать с тестовыми данными .. но что, когда частота данных довольно высока ... так что все зависит от вашего анализа частоты данных. –

0

Если вы собираетесь использовать один стол, вы можете попробовать что-то вроде этого.

TABLE { ID, ParentID, Идентификатор_пользователя, Тип, Текст, PostDtm }

Это дает вам базовую структуру дерева в одной таблице.

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

убедитесь, что у вас есть индексы на столбцах id как минимум.

Я до сих пор не уверен, сколько вам нужно. Такой сайт, как facebook, должен учитывать гораздо больше, чем оптимизацию на уровне таблиц. Для большинства сайтов реляционная модель учебника может быть запрошена более эффективно, чем эта модель. Каковы ваши целевые показатели эффективности?

+0

Ну, чтобы превзойти трафик Facebook, вы должно быть действительно большим и лучшим. Я не говорю об этом виде трафика, но я думаю, что трафик для выше среднего сайта. «Для большинства сайтов реляционная модель учебника может быть запрошена более эффективно, чем эта модель». Я не уверен, как вы это предположили, и я могу ошибаться, но у меня есть сильное чувство, что операции с соединениями более тяжелые, чем основной запрос на одну таблицу. В любом случае, я протестировал эту модель и, похоже, отлично справился с этим в прошлом. – Roman

0

enter code here @ Мое предположение заключается в том, чтобы укусить пулю, и если вы используете MySQL, то используйте отношения или переходите к другому типу базы данных, если хотите полностью уйти от таблиц с отношениями. Вы желаете «чистой» реализации атипичной модели RDB. Для RDB я предлагаю вам использовать четыре таблицы: пользователи, user_map, вопросы, ответы. Ответы являются категориальными (например, к Вопросу или Ответу), поэтому отслеживайте, какой тип он является, где единственными внешними ключами в любой таблице являются question.id и user.id.

Users: id, name 
User_map (can be used with Questions and/or Responses to join the data): u_id, q_id 
Questions: id, text_value 
Responses: id, q_id, text_value, category 

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

+0

Нет никакого преимущества в создании дополнительных таблиц, когда все вопросы, ответы и комментарии - одно и то же в самом основном. Я вижу много ответов, в которых говорилось, что я должен разбить мой стол. Мой вопрос действительно не имеет ничего общего с одной таблицей против трех. То, что все здесь предлагают, за исключением @ceejayoz, - это дизайн 101 DB, и даже если я разбиваю свой текущий дизайн и делаю то, что вы предлагаете, мой оригинальный вопрос не будет дан! Я тоже знаю, какой красивый дизайн выглядит, но мне очень нравится изучать оптимизированный способ изготовления кормовых стен. – Roman