2015-02-05 4 views
0

Быстрый вопрос, думаю, я знаю, что я знаю ответ, но в затылке есть голос, который спрашивает: «Почему бы так не сделать?»Хранение данных для нескольких категорий?

Так что я работаю над чем-то (для немного веселья больше всего на свете), и мне нужно хранить списки связанных предметов, например список мячей, список блоков, список рыб. И поэтому каждый из этих элементов имеет ID, NAME, DETAIL (возможно, путь к изображению).

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

Один являющейся таблица категорий, как так:

CAT_ID | CAT_NAME 
1  | BALLS 
2  | BLOCKS 
3  | FISH 

и таблицу всех элементов вместе, где cat_id будет связан с ID в таблице выше.

ITEM_ID | ITEM_CAT_ID | ITEM_NAME | ITEM_DETAIL 
1  | 1   | Soccer Ball | A ball used in the game of Soccer 
2  | 1   | Rugby Ball | A ball used in the game of Rugby 
3  | 3   | Trout  | A fresh-water fish 

так далее и так далее .. Но мне интересно, что лучший способ, чем сделать таблицу для каждой категории и выбрать из этой таблицы, а не «где cat_id = #»?

Я знаю, что это будет работать в любом случае, но каков был бы правильный/стандартный способ сделать это?

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

+0

Если вы знаете, что столбцы одинаковы, предпочтительнее 1 таблица – Strawberry

ответ

1

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

ITEM_ID | ITEM_CAT | ITEM_NAME | ITEM_DETAIL 
1  | Balls  | Soccer Ball | A ball used in the game of Soccer 
2  | Balls  | Rugby Ball | A ball used in the game of Rugby 
3  | Fish  | Trout  | A fresh-water fish 

Внезапно, у меня нет никаких записей о существующей в blocks категории, и я не буду, пока я добавить элемент этой категорией. Аналогичным образом, я мог бы сделать опечатку и изменить элемент 2 на «бляшки», и теперь, если я запрошу все предметы с категорией balls, я не получу правильное значение. Я уверен, что вы можете увидеть другие возможные аномалии.


С точки зрения нормализации, в этом конкретном примере, используя cat_name вместо cat_id в одной таблице все еще был бы по меньшей мере в третьей нормальной форме, потому что каждый столбец ключа не зависит от ключа. Однако может возникнуть ситуация, когда вы хотите также сохранить описание категории. В одной таблице, вы бы это:

item_id | cat_name | cat_description | item_name | item_detail 

Теперь у вас есть транзитивная функциональная зависимость, item_id -> cat_name и cat_name -> cat_description. Из-за транзитивной функциональной зависимости эта таблица находится только во второй нормальной форме.

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

1

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

Смежные вопросы