Лучший метод хранения базы данных

Мое программное обеспечение (написанное на PHP) позволяет пользователям использовать HTML-форму для ввода информации для своего «Резюме». В этом «резюме» есть несколько различных элементов, включая образование пользователя, историю работы, награды, сопроводительное письмо и т. д. Каждый элемент уникален в данных, которые он содержит. Например, для образования требуются такие поля, как год выпуска, название школы, степень и т. д.

Мой вопрос: как лучше всего хранить данные резюме в базе данных mySQL? Мой текущий выбор:

  • Создавайте отдельные таблицы для каждого элемента резюме (resume_education, резюме_awards и т. д.)
  • Используйте единую таблицу для всех элементов резюме и вставляйте данные элементов в виде многомерных массивов. (IE: одна таблица, содержащая данные резюме с такими столбцами, как образование, трудовая история и т. д. Данные об образовании или аналогичные поля будут скомпилированы в массив, например ("град_год" => "1990", "школа_название" =>" Cool School") или что-то подобное, где использование указателей обозначает новое поле).

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


person cbronson    schedule 08.01.2013    source источник
comment
На самом деле ваши оценки «за» и «против» прямо противоположны!   -  person Francis Avila    schedule 08.01.2013
comment
Ну, я бы предпочел, чтобы несколько таблиц было легче поддерживать, чем пытаться пройти несколько многомерных массивов в одной таблице. Но я понимаю, откуда вы могли исходить, поскольку я не уверен в влиянии любого метода на время загрузки.   -  person cbronson    schedule 08.01.2013
comment
Меня бы не беспокоило время загрузки чего-то такого простого. Несколько таблиц с соединениями — хороший вариант.   -  person shapeshifter    schedule 08.01.2013
comment
Что ж, это всего лишь один элемент всего профиля пользователя, который должен поддерживать множество пользователей и записей.   -  person cbronson    schedule 08.01.2013


Ответы (3)


Я бы выбрал несколько таблиц, но не именованные таблицы, что-то более общее.

Например. столы

resume_section
id,name
1,personal details
2,education
3,work history

resume_section_attributes
id,resume_section_id,name
1,1,name
2,1,phone
3,1,email
4,2,school_name
5,2,grad_year
6,3,company_name
7,3,number_of_years

user_resume
id,user_id,resume_section_attribute_id,value
1,99,1,My Name
2,99,2,12345678

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

person shapeshifter    schedule 08.01.2013
comment
Прочитав это, я пытаюсь избежать полностью нормализуется. Спасибо, что заставили меня вспомнить о масштабируемости, так как удаление определенных элементов из одной строки, содержащей массив с длиной, превышающей 5-10 элементов, было бы головной болью. - person cbronson; 08.01.2013
comment
Будете ли вы иметь дело с таким объемом? Кроме того, это действительно зависит от ваших данных. Вы хотите жестко закодировать номер телефона и мобильный телефон или разрешить пользователю добавлять столько, сколько он хочет. Этот комментарий резюмирует это. Нормализованная модель допускает n номеров телефонов пользователей, экранных имен, принадлежности и истории работы. Он также не заботится о порядке этих элементов. - person shapeshifter; 08.01.2013
comment
Да, я пытаюсь подготовиться к большому количеству пользователей. Я согласен с тем, что вы говорите. Но я не понимаю, как использование резюме_телефона в качестве таблицы может быть отрицательным? Я мог бы хранить несколько телефонных номеров для одного пользователя, если бы я не установил свой столбец идентификатора пользователя как УНИКАЛЬНЫЙ, верно? - person cbronson; 08.01.2013
comment
На самом деле, наверное, хуже. Теперь вы говорите о многих таблицах для одного резюме, вам нужно будет проиндексировать их все и запросить по всем из них. Что делать, если вы хотите добавить новое поле? Создайте новую таблицу и сделайте все жесткое кодирование, чтобы заставить ее работать. Представьте, что вы просто добавляете новый атрибут, устанавливаете его имя, раздел, в котором он находится, и его порядок в этом разделе, и бьете его там, чтобы заполнить. - person shapeshifter; 08.01.2013
comment
Хм, в таком случае, я думаю, я не совсем понимаю код вашего примера. Не могли бы вы взять это, чтобы поболтать со мной? - person cbronson; 08.01.2013
comment
Я только что представил общую идею таблицы, вам нужно будет написать код. Но я хочу сказать, что если вы подойдете к этому с общей точки зрения, это облегчит вам задачу в будущем. Кроме того, вы можете просто многому научиться и иметь хорошее программное обеспечение, которым можно похвастаться. - person shapeshifter; 08.01.2013
comment
Если вам нужен пример крайнего конца общей шкалы, взгляните на узлы и типы содержимого Drupals. Вы можете создать что угодно с ними. Я не использую друпал, но я читал о том, как они это делают. - person shapeshifter; 08.01.2013
comment
Я должен поблагодарить вас, я никогда полностью не понимал нормализацию базы данных, пока не разобрался с вашей структурой таблицы. Вы избавили меня от многих хлопот в будущем. Большое спасибо, чувак! - person cbronson; 08.01.2013
comment
Без проблем! Как говорится в этих статьях, это не всегда лучший вариант. Но я думаю, что это приложение идеально подходит для того, чтобы узнать, как это сделать, оно не слишком сложное, и вы сможете повторно использовать идеи в будущем, когда потребуется разрешить неограниченное количество телефонных номеров или контактов и т. д. Старайтесь ничего жестко не программировать в своем код, поэтому, когда вы добавляете новый атрибут, например, в личные данные, он автоматически появится в вашей форме без какого-либо дополнительного кода. Например. построить форму из БД. - person shapeshifter; 08.01.2013

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

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

person Larry Lustig    schedule 08.01.2013

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

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

person DWright    schedule 08.01.2013
comment
Спасибо за эту ссылку, я посмотрю еще раз (я тоже видел это несколько месяцев назад). Извините, что случайно нажал Enter, в любом случае, что касается дизайна самой базы данных, я не вижу никакого влияния на дизайн от содержимого самих столбцов, верно? - person cbronson; 08.01.2013