Структура базы данных для хранения разделов тем глав подтем - PullRequest
4 голосов
/ 31 августа 2011

Я собираю структуру базы данных, которая может содержать данные для курсов. Каждый курс будет состоять из нескольких глав, и каждая глава МОЖЕТ содержать темы, а каждая тема МОЖЕТ иметь подтемы и т. Д.

Это пример данных

Course - Accounts
1) Introduction to Accounts
   a) Basic Accounts
2) Financial Statements
   a) Income statement
      i) Depreciation
   b) Cash Flow Statement
3) Career as an accountant 

Теперь с каждой из этих тем будут связаны примечания к лекциям. Теперь я думаю, что это глава 1 - «Введение» - заметки будут связаны с темой «Основные счета». Но в главе 2 - «Отчет о прибылях и убытках» не будет никаких примечаний, но «Амортизация» будет иметь примечания. Теперь, поскольку глава 3 «Карьера в качестве бухгалтера» не имеет подтем - примечания будут связаны непосредственно с ней.

Это только мой способ или организация - я могу применять правила, согласно которым каждая глава должна иметь подтему, чтобы заметки могли быть связаны и т. Д.

Это то, что я имею до сих пор

Table: Course
course_id
course_name

Table: Topics
topic_id
parent_topic_id
topic_name
notes

Table: Course_Topics
course_id
topic_id

Таким образом, пример данных будет выглядеть как

Course_id  |  Course Name
    1          Accounts

Topic_id  | Parent_topic_id  |   topic_name           | notes
    1             0             Introduction
    2             1             Basic Accounts
    3             0             Financial Statements
    4             3             Income Statements
    5             4             Depreciation

Course_id   |    Topic_id
    1               1
    1               2
    1               3
    1               4
    1               5

Вот что я ищу: 1) Есть ли лучший способ разработать это - должен ли я применять более строгие правила о том, как примечания связаны с главами или темами или подтемами

2) Во-вторых, с учетом этой структуры данных, если я хочу получить все темы для данного курса и отобразить их в формате главы -> тема -> древовидная структура подтемы. Как бы я это сделал. Должен ли я просто извлечь все темы на основе идентификатора курса, а затем на стороне сервера сохранить их в структурах данных и упорядочить их в соответствии с главой / темой / подтемой или есть более чистый способ сделать это с помощью подзапросов.

Извините за длинный пост - просто хотел четко объяснить. Спасибо за ваше время

****** РЕДАКТИРОВАТЬ ********

Спасибо за все ответы, парень. Я столкнулся с другим подходом - добавить столбец линии и глубокий столбец в таблицу.

Подход объясняется здесь как "Модель плоского стола сделана правильно" http://www.ferdychristant.com/blog/archive/DOMM-7QJPM7

Что вы, ребята, думаете об этом подходе?

Secondly - John raised a good point in his answer. How would I handle inserts in between.
- Chapters (parent_id =0) Say if I want to insert a new chapter between chapter 1 and 2
- Topic (parent_id != 0 ) If I want to insert a new topic between any two existing topics

Должен ли я иметь другой столбец, поддерживающий порядок, например, 1,2,3, а затем, если я хочу вставить что-то между главами 1 и 2 - вставить это значение со значением 1,1 или что-то подобное - можно ли использовать тот же столбец по темам.

Еще раз спасибо

Ответы [ 4 ]

4 голосов
/ 31 августа 2011

Пропустить таблицу course_topics, если это отношение один-ко-многим.

Вы можете сделать это

Table: Course
course_id
course_name

Table: Topics
topic_id
parent_topic_id
topic_name
notes
course_id

Примечания выглядят хорошо, если это всего лишь одно текстовое поле.Если есть еще что-то, вам нужно добавить его в другую таблицу.

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

order level
000   0
000.1 1
000.2 2
001.1 0
001.2 1

Просто ищите иерархические данные в sql ... Так как вы используете mysql, и если вы думаете,хочу пойти на список смежности или вложенный список вот анализ.http://explainextended.com/2009/09/29/adjacency-list-vs-nested-sets-mysql/ а также .... посмотрите на этот вопрос, это многое объясняет -> Какие есть варианты хранения иерархических данных в реляционной базе данных?

2 голосов
/ 31 августа 2011

В зависимости от вашей СУБД (сервера управления реляционной базой данных) может существовать тип данных hierarchy_id, предназначенный для этого конкретного типа сценария.

Используемый вами проект известен какмодель "связанного списка" или модель "списка смежности".У него, безусловно, есть некоторые большие недостатки, такие как требование использовать рекурсию для большого количества запросов.

Другой вариант - использовать модель «вложенных множеств».Поиск в Google «вложенных наборов Джо Челко» должен дать некоторые статьи на эту тему.Вы также можете прочитать его книгу по всему предмету моделирования деревьев и иерархий в реляционных моделях данных.Этот метод также имеет некоторые недостатки (обновления, вставки и удаления могут быть более сложными).

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

0 голосов
/ 31 августа 2011

Это неплохой первый срез.

Я бы добавил поле section_designator в вашу таблицу Topics. Если это глава, вы можете назвать ее «Глава 3». Если у вас есть раздел в этой главе, вы можете назвать его «Раздел 4» в этой теме, а затем объединить section_designator s от этого и всех его родителей, чтобы получить полную иерархию («Глава 3, Раздел 4»).

Нет ничего плохого в организации стороны сервера данных, как вы описали.

0 голосов
/ 31 августа 2011

Вы можете сделать все это только с одной таблицей для глав и тем.Вам нужно 2 поля, order, которое просто отслеживает порядок элементов, и level, которое определяет, сколько уровней отступов вам нужно.

Преимущество этого подхода состоит в том, что он устраняет необходимость в произвольном количестве таблиц для записи главы, темы, подтемы, подтемы и т. Д.

Недостатком являетсяу вас нет справочных данных о том, какие темы принадлежат к каким другим темам.Но эта информация вычислима.Кроме того, вам нужно управлять полем order каждый раз, когда вы изменяете строку.

...