Является ли эта структура базы данных вменяемой, правильной и нормализованной? - PullRequest
1 голос
/ 19 февраля 2010

Итак, вчера я задал 2 вопроса, которые вращались вокруг одной и той же идеи: реорганизация базы данных, которая не была нормализована, а B - была неразбериха из-за моего невежества. Большую часть дня я провел, организуя свои мысли, читая и прорабатывая некоторые тесты. Сегодня я думаю, что у меня есть намного лучшее представление о том, как должна выглядеть и действовать моя БД, но я хотел убедиться, что понял основные идеи правильного проектирования и нормализации БД SQL.

Первоначально у меня была ОДНА таблица, называемая «Файлы», в которой содержались данные о файле (его URL, дата загрузки, идентификатор пользователя, кто его загрузил и т. Д.), А также столбец «оценки», представляющий уровень оценки, который вы могли бы получить. использовать этот файл для. (К вашему сведению: эти файлы являются планами уроков для школ) Я понял, что нарушил Правило № 1 о нормализации - я хранил свои «оценки» как «1,2», «2,6» или «3,5,6». "в одном столбце. Это вызвало сильные головные боли при попытке проанализировать эти данные, если я хотел посмотреть уроки JUST 3-го класса или JUST 5-го класса.

То, что мне предложили, и что стало очевидным позже, это то, что у меня есть 3 таблицы:

файлов (данные о файлах, URL и т. Д.) оценки (таблица доступных уровней оценки. Вероятно, 1-6, чтобы начать) files_grades (таблица соединений)

Это имеет смысл. Я просто хочу убедиться, что я понимаю, что я делаю, прежде чем я это сделаю. Допустим, пользователь А загружает файл xyz и решает, что он подходит для классов 2 и 3.

Я бы записал ОДНУ запись в таблицу «files» с данными об этом файле (размер в килобайтах, URL, описание, имя, первичный ключ files_id). Допустим, он получает идентификатор 345.

Из-за ограниченного числа вариантов оценок оценки, вероятно, будут эквивалентны их идентификатору (т. Е. 1 класс - grades_id 1, 2 класс - grades_id 2)

Затем я бы написал ДВЕ записи в таблицу соединений "files_grade", содержащую

files_grade_id, files_id и grades_id, т.е. 1011 *

1,345,2

1,345,3

Для представления двух оценок, для которых подходит files_id 345. Затем я машу волшебными палочками SELECT и JOIN и извлекаю нужные мне данные.

Имеет ли это смысл? Неужели я опять неправильно понимаю правильную структуру реляционной базы данных «многие ко многим»?

Задача 2, которая меня только что осенила: итак, урок может иметь несколько «оценок». Нет проблем, мы просто решили это (надеюсь!). Но теоретически он может иметь несколько «школ», а именно: начальную, среднюю, высшую. Что нам делать, если запись файла имеет 1,2 балла для среднего, высокого уровня? Это очень легко решить, сказав «Одна школа на файл, пользователи!», Но мне нравится показывать это там.

Ответы [ 3 ]

1 голос
/ 19 февраля 2010

Затем я бы записал ДВЕ записи в таблицу соединений "files_grade", содержащую

files_grade_id, files_id и grades_id, т.е.

files_grade_id здесь избыточно, потому что комбинация files_id и grades_id уже уникальна (поэтому может быть установлена ​​в качестве первичного ключа).

Но это можетв теории есть несколько «школ», а также - начальная, средняя, ​​высшая.Что нам делать, если запись файла имеет 1,2 классы для среднего, высокого уровня?

В зависимости от ваших требований, вы можете сохранить их как «продолжение» предыдущих классов, например, 1-6элементарный, 7-9, средний, 10-12 высокий.Тогда вы можете полностью обойтись без таблицы grades (поскольку вы можете просто сохранить эти числа в таблице files_grade ).

0 голосов
/ 19 февраля 2010

Поскольку на ваш первый вопрос уже дан ответ, я сделаю удар по второму.

Есть несколько способов сделать это, но одна возможность состоит в том, чтобы добавить другую таблицу для «Школ» и включить ее как часть соединительной таблицы - конечно, переименовав соединительную таблицу, чтобы соответствовать новому дизайну. Итак, вы можете иметь:

School Table:

-------------------------
  SchoolId  |   School  
-------------------------
     1      | Elementary
     2      | Middle
     3      | High
-------------------------

Files_grades_school

------------------------------------
  FileId  |   GradeId  |  SchoolId 
------------------------------------
    345   |      1     |      1
    345   |      1     |      2

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

0 голосов
/ 19 февраля 2010

По звукам это звучит довольно хорошо. Только одна вещь: вам не обязательно иметь идентификатор для таблицы мостов (FILES_GRADES), и если вы это сделаете, вам нужно увеличить идентификатор.

У вас будет первичный ключ, состоящий из двух частей: grade_id и file_id, files_grade_id просто усложнит ситуацию и приведет к плохому индексу, поскольку вы никогда не будете использовать его в выборке.

...