2016-08-02 3 views
0

Скажем, у меня есть простая таблица продуктов: Id, ProductCode, цена, описание и т.д.SQL Database Design - небольшой процент строк уникальных

И у меня есть 10000 продуктов ... но 100 из них требуют сэмплы (например, они ксилофоны). Я хочу сохранить в db, есть ли у продукта образец звука.

Следовательно, лучше ли хранить в таблице продуктов как «has_sound» логический (истинный или ложный) coloumn или как отдельную одну таблицу столбцов, в которой перечислены все идентификаторы продукта со звуками?

Хранение в таблице продуктов означает, что подавляющее большинство будет иметь «has_sound = false», что кажется немного ненужным. Но хранение только списка «продуктов со звуками» также кажется немного «неправильным» для меня.

Большое спасибо :)

+1

Да, вы правы, оба способа, о которых вы думаете, не подходят, потому что в будущем у вас может быть условие проверки «has_book» или чего-то другого, тогда вы не сможете поддерживать таблицу или поле для чего-то определенного снова и снова. Вместо этого я думаю, что использование поля типа «product_type» или что-то подобное может быть полезно. Вы можете определить перечисления для «product_type». –

ответ

1

У вас есть 10 000 строк.

Даже если вы выберете неэффективный размер поля в 4 байта, вы посмотрите на все ~ 40k на диске, добавив поле в таблицу продуктов. Напротив, пустая таблица innodb с полями (int, tinyint) составляет ~ 100k на диске (плюс дополнительные служебные данные RAM для хранения метаданных таблицы). Заполнение этой таблицы 100 записями не имеет значения, потому что все помещается в одну страницу распределения.

Ни один из этих накладных расходов даже не приходит удаленно близко к оценке производительности.

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

0

Новая таблица является более правильной реляционной. Если бы это был я, у меня была бы таблица с двумя столбцами, идентификатор продукта и BLOB с образцом звука для тех продуктов, которые имеют образец звука. Хотя у вас может быть Boolean (или NULLable BLOB) в таблице, разделение его позволяет лучше разделить и дополнительные данные вокруг образца звука (различные форматы выборки, несколько октав/шагов/заметок или что-то еще) сохранено в правильном месте следующего к звуку.

Как сказал Леви, «лучшее» является самым удобным, поскольку в этом масштабе не будет значительных проблем с производительностью или отходами.