Дизайн таблицы для ключевых слов - PullRequest
1 голос
/ 14 февраля 2011

У меня много ключевых слов и список слов, связанных с каждым ключевым словом

Скажите ключевые слова НАУКА, КОМПЬЮТЕРЫ, СТРУКТУРЫ

Под каждым ключевым словом есть список слов, таких как

НАУКА - ботаника, зоология, физика .....

КОМПЬЮТЕРЫ - базы данных, операционные системы, .....

СТРУКТУРЫ - стеки, очереди, массивы, ....

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

Ответы [ 3 ]

3 голосов
/ 14 февраля 2011

Я полагаю, что так и должно быть.

Category (ID, NAME)
  1  Science
  2  Computers
  3  Structures


SubCategory(ID, CATID, NAME)
  1  1  botany
  2  1  zoology
  3  2  databases

CATID в subcategory - это внешний ключ, ссылающийся на таблицу ID в category.

2 голосов
/ 14 февраля 2011

Вы думаете о «отношениях» неправильно. Хотя верно, что ботаника не связана с базами данных (за исключением некоторых очень, очень редких угловых случаев), вы смотрите на data , а не на вещь .

Как вы смоделируете это, зависит от того, как вы просматриваете эти ключевые слова. Являются ли это строгими отношениями с одним родителем, когда ключевое слово child может никогда иметь дочерние, а ключевые слова принципиально отличаются от родительских (другими словами, родители служат только в качестве механизма классификации и сами по себе не являются , ключевые слова)? Или вы могли бы «глубоко» вложить эти ключевые слова и использовать их в качестве ключевых слов на любом уровне (другими словами, у «ботаники» могут быть дети, а «НАУКА» - такое же ключевое слово, как и «ботаника»)?

Если это первое, вам нужно смоделировать его примерно так:

Category
----------
CategoryID (PK)
Name

Keyword
---------
KeywordID (PK)
CategoryID (FK)
Name

Если это второе, вы бы смоделировали его примерно так:

Keyword
---------
KeywordID (PK)
ParentKeywordID (FK)
Name

Где ParentKeywordID - это внешний ключ, допускающий значение NULL, обратно к Keyword. Вы создали таблицу, которая ссылается на себя, и подобные структуры определяют древовидную структуру с узлами, которые могут быть вложены на любом уровне.

примечание

Многие скажут вам, что хранить значения null в базе данных - плохая идея, и я согласен с этими людьми в целом. Если вы действительно хотите перейти к полностью нормализованному формату хранения (в любом случае нормализованному до 5NF), вам придется сделать это следующим образом:

Keyword
-----------
KeywordID (PK)
Name

KeywordParent
-------------
KeywordID (PK, FK)
ParentKeywordID (FK)

Тогда ваши ключевые слова верхнего уровня просто не будут иметь строк в KeywordParent.

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

0 голосов
/ 14 февраля 2011
KeyWords (ID, PARENT, NAME)

1 null Science 
2 null Computers
3 null Structures
4  1   botany
5  1   zoology
6  2   databases

Типичная древовидная структура.

...