2011-07-21 1 views
1

Я пытаюсь создать нормализованную базу данных для блога, позволяющую отвечать на комментарии. Учитывая несколько ответов, которые я нашел, мне кажется, что мне нужно посмотреть на модель списка смежности и модифицированный алгоритм обхода дерева предзаказов. Однако, после reading немного об этом, я не нашел пример этого, используя внешние ключи для обеспечения целостности данных. Это можно сделать?Структура схемы базы данных и внешние ключи в MySQL

Какой дизайн базы данных вы рекомендуете в этом случае? В идеале я хотел бы устранить родительский комментарий и используя отношения PK-FK (PK = первичный ключ, FK = внешний ключ), также сможет устранить все дочерние комментарии, чтобы избежать сохранения сирот в Таблица.

ОБНОВЛЕНИЕ: В качестве пояснения я также хотел бы узнать, какой дизайн базы данных используется в блогах, которые позволяют отвечать на комментарии (то есть комментарии, ответившие на комментарий, ответивший на исходный поток).

ответ

1

Reddits исходный код является открытым исходным кодом на Github, посмотреть, как они это делают ....

+0

Умм, интересно ... Я сделаю это. –

+1

О, о ... reddit использует Cassandra :-(, хотя такое предложение может быть очень полезным. –

1

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

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

Я не понимаю, о чем вы здесь спрашиваете. Вся модель в значительной степени опирается на отношения PK/FK (между комментарием и его родителем). В статье, которую вы указываете, не сказано так явно (что я вижу), но столбец будет PK, а столбец будет FK.

+0

На самом деле, я думал, что мне нужно использовать каскадные удаления. Почему это не рекомендуется? W.r.t. модель, полагающаяся на отношения PK/FK, вы правы, но если у родителя может быть много детей, когда вы исключаете родителя (который является PK), его дети будут удалены из этой таблицы, но мне было интересно, какие дизайн базы данных позволит удалить этих детей из другой таблицы (возможно, «таблицу комментариев»), но это будет использовать каскадные удаления. Учитывая, что это не рекомендуется, прекрасно ли удалять этих детей-сирот с помощью запроса через PHP? –

+0

Re: Каскадирование удаляет по базе данных - выполните некоторые поиски по этой теме. Обычно я их не использую, но ваш сценарий может быть достаточно простым, чтобы они не вызывали проблем. Я думаю, что если вам нужно чистое вложение комментариев, вам нужен список смежности.Единственный вариант, о котором я могу думать, это модель «вложенного набора» (которую любят некоторые люди - я лично ненавижу). Я все еще не уверен, что я четко понимаю ваш вопрос PK/FK. –

+0

Спасибо за ваш ответ. Хорошо, я посмотрю на это. Что касается вопроса PK/FK, в основном я спрашивал, какая схема базы данных позволит сохранить целостность данных, когда вы удаляете родительский комментарий, поскольку модель смежности, например, предоставляет модель для упорядочения элементов таблицы иерархически и их получения но сам по себе этого недостаточно для блога с функцией «ответ на комментарии». –

0

Да, MySQL поддерживает внешние ключи и каскадные удаляет как часть его двигателя для хранения базы данных. Вам нужно будет использовать InnoDB, который не является значением по умолчанию. Изменение механизма хранения очень просто и может быть выполнено даже после создания таблиц.

MySQL официальная документация:

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

Переделка:

ALTER TABLE table1 ENGINE = InnoDB;

Есть дополнительные плюсы и минусы использования движка InnoDB против движка MyISAM (по умолчанию для механизма хранения MySQL). Поэтому вы должны тщательно изучить эти два вопроса, прежде чем вводить их в производственную среду. MyISAM не поддерживает внешние ключи.

+0

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