2010-11-17 7 views
1

У меня есть таблица MySQL, каждая строка представляет Person. Для каждого человека, я хотел бы показать список связанных ссылок (при создании своей страницы на моем сайте), поэтому я создал столбец под названием «RelatedLinks», которые там я сохранить необработанное содержание HTML, такие как:Сохранение нескольких атрибутов в одной строке MySQL

<a href="domain1.com">Related Link 1</a> <a href="domain2.com">Related Link2</a> 

Тогда Я просто использую PHP для echo $row["RelatedLinks"]; внутри самого HTML.

Проблема с этой реализацией заключается в том, что у меня мало контроля над ссылками, например, при изменении порядка их появления на веб-сайте, удалении/редактировании определенной ссылки и т. Д.

Вторая идея, которую я думал о том, чтобы создать столбец в таблице для каждой линии связи, связанной, например, «RelatedLink1», «RelatedLink2», а затем использовать PHP эхо $row["RelatedLink1"] . "<br />" . $row["RelatedLink2"].

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

Что такое эффективный способ достижения этой функциональности?


EDIT

Ссылаясь на ответ Габриэля, теперь вопрос о сложности:

С текущей реализации, как только я выбираю человека, у меня есть все ссылки в моей руке - сложность O (1). Какова будет сложность запуска запроса, чтобы выбрать все внешние ключи текущего Человека, как предложено Габриэлем (и Хаим) ниже?

Спасибо,

Joel

+2

вам нужно сохранить все эти ссылки в новой таблице со ссылкой на PersonId –

+0

Хаим прав. Не добавляйте больше столбцов. Нормализовать настройку базы данных, просто сохранить имя ссылки и ссылку и дать ссылку на запись пользователя. – aefxx

+0

Отредактированный вопрос – Joel

ответ

1

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

Если вы думаете, что вы будете иметь больше операций редактирования, вы могли бы попытаться создать вторую Tabel, чтобы содержать id_pearson, ссылки, текстом, заказ. И вы можете использовать этот вкладку для редактирования ссылок для конкретного pearson.

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

лица стол: id_person, имя (и все другие данные)

ссылки стол: id_link, текст, ссылка

person_links: id_person, id_link, заказать

С помощью этой настройки вы можете редактировать ссылки в одном месте, и все люди будут иметь доступ к одной и той же версии.

ПОЗДНО ИЗМЕНИТЬ В ответ на комментарий

Окей, о сложности операций, ничто не может бить первое решение. Но вы должны принять во внимание несколько вещей, которые вам нужны:

  • Как часто вы ожидаете изменить ссылки?
  • Кто поменял ссылки (администратор сайта или конечный пользователь)?
  • как много случаев того же ссылка появится для разных лиц (с использованием первого решения, вам придется редактировать все лица, которые содержат эту ссылку)

Чтобы ответить на вопрос о сложности решения, предложенные я O (n), если я не ошибаюсь. Используя внешние ключи и правильную индексацию в MySql, у вас не должно быть проблем с этим.

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

Надеется, что это помогает, Габриэлю

+0

Спасибо, Габриэль! В этом контексте вы можете ссылаться на мои комментарии к комментариям Хаима на мой пост. Это также относится к вашему решению :) – Joel

+0

Здравствуйте, сложность будет O (n) Я считаю. Более подробно в моем ответе. –

1

Вы должны второстепенную таблицу, содержащую PersonID (foreign Key), RelatedLink(ID) и, возможно, в OrderID.

Что-то вроде

Table PersonRelatedLinks 
PersonID 
RelatedLink or RelatedLinkID 
OrderID 
SpecialFormat maybe 
Смежные вопросы