2013-01-02 2 views
4

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

+2

Неплохая практика. Просто помните, что многие базы данных не могут выполнять рекурсивные запросы и/или создавать такую ​​структуру таблицы с помощью одной таблицы создания. вам, возможно, придется создать его, а затем изменить его, чтобы добавить FK впоследствии. –

+0

Если вы можете указать родительский идентификатор null, то ограничение внешнего ключа не имеет смысла. Ограничение внешнего ключа состоит в том, чтобы убедиться, что у вас нет «сирот». –

+0

@SteveWellens В случае, если вы хотите убедиться, что нет сирот, если не null? – Matthew

ответ

4

Это прекрасно. Вам нужно подумать о том, что делать, если комментарий с детьми удаляется. Ограничение FK предотвратит удаление, и общее решение каскадирования удаления здесь не подходит, а также NULL-вывод родительской ссылки. Поэтому вам, вероятно, придется оставить удаленный комментарий и просто очистить содержимое или иначе пометить его как удаленный.

2

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

Поскольку комментарии-на-комментарии составляет логическое дерево, это может быть стоит проверить работу Celko в:

http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html

очень удобно!

1

http://msdn.microsoft.com/en-us/library/ms124432(v=sql.100).aspx

Для SQL Server это не плохая практика, см.выша ссылки для работника таблицы definaion и обратитесь к колонку ManagerID, Microsoft использовала этот сценарий в БД образца, снабженный сервером SQL.

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

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