|
|
|
| Добрый день.
Интересует ваш совет по поводу моего решения хранения различных данных в базе.
Данные могут быть как список наименований услуг, так и список городов или список марок автомобилей с описанием.
На сколько правильно будет хранить их в одной таблице. Может быть лучше создавать для всех свои?
Создаю:
CREATE TABLE IF NOT EXISTS data_fields (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
data_key VARCHAR(255),
data_value VARCHAR(255),
data_value_two VARCHAR(255),
data_int INT,
data_int_two INT,
data_date DATETIME,
data_date_two DATETIME,
data_text TEXT,
data_text_two TEXT,
data_type VARCHAR(255)
) ENGINE=MyISAM CHARACTER SET=utf8;
|
для любых данных есть по два поля которые могут быть заполнены. В зависимости от типа данных заполняю add_type. Когда нужно выбираю то, что мне нужно. | |
|
|
|
|
|
|
|
для: tima2010
(18.07.2013 в 11:38)
| | На сколько правильно будет хранить их в одной таблице
чаще всего это не правильно
Существуют законы нормализации БД, ориентируясь на них и следует создавать архитектуру базы данных. Есть классический пример БД книжного магазина, поищите его в инете.
Еще одно правило, каждая сущность - это отдельная таблица, отношения сущностей многие ко многим описываются таблицей связи | |
|
|
|
|
|
|
|
для: Valick
(18.07.2013 в 19:25)
| | > Существуют законы нормализации БД,
Не вижу их нарушения.
Если данные однотипные, то почему их не хранить вместе?
> каждая сущность - это отдельная таблица
Сущность - абстрактный объект у которого есть название и описание.
Таблица:
id | group_id | name | description
1; 1; стрижка; описание стрижки
2; 1; укладка; описание укладки
3; 2; Барнаул; красивый город
4; 3; Лада; ведро с гайками
5; 3; Ламборгини; Супер-кар
В чем нарушение?
Топикстартер, нужно по данным смотреть. Если они все всегда однотипные, то проблем нет.
Но если вам придется ради этого для некоторых групп хранить числа в поле VARCHAR, или для некоторых групп не существует какого-то параметра и соответствующее поле для этой группы всегда будет null, ТО ЭТО ЗЛО. | |
|
|
|
|
|
|
|
для: Sfinks
(19.07.2013 в 13:59)
| | спасибо за ответы!
почему NULL зло?
Что будет плохого если какая либо ячейка для определенного поля не заполнена и является null?
К примеру у стрижки нет data_text_two
запросом выбираю:
SELECT * FROM data_fields WHERE data_type = 'haircut' | |
|
|
|
|
|
|
|
для: tima2010
(19.07.2013 в 14:07)
| | Потому что это уже нарушение законов нормализации.
Например если вы в мой пример добавите поля: диаметр колес, стоимость услуги и численность населения, то таблица у вас будет заполнена в шахматном порядке....
Это и есть ЗЛО =)
И это вам аукнется в будущем. | |
|
|
|
|
|
|
|
для: Sfinks
(19.07.2013 в 14:15)
| | к сожалению самостоятельно не могу найти нормальный мануал по теме: закон нормализации БД
можете дать пару линков?
заранее благодарен. | |
|
|
|
|
|
|
|
|
для: Sfinks
(19.07.2013 в 18:51)
| | там слишком высокопарно описано :)
тут проще http://www.wwwmaster.ru/article.php?nart=21 | |
|
|
|
|
|
|
|
для: Valick
(19.07.2013 в 19:38)
| | Спасибо, нашел статью на Вашем же сайте - http://www.softtime.ru/bookphp/gl12_6.php
Понял что такое нормализация, но остался еще 1 вопрос в правильности построения запроса в ненормализированной таблице, где данные различаются по типу указанному в поле.
к примеру есть таблица:
my_table
- id
- name
- date
- text
- type
где хранятся различные данные, различить их можно по полю type.
Как происходит поиск по запросу?
SELECT text WHERE type = 'articles' AND name = 'text'
Сначала выбираем тип записи, далее запрос производит сверку по полю NAME только с теми записями которые подходят по полю TYPE? или снова происходит выбор (поиск) по всей таблице?
Проще говоря:
Если из 100000 записей есть 2 с типом articles то произойдет поиск name только по двум или снова по всем 100000 ?
Спасибо. | |
|
|
|
|
|
|
|
для: tima2010
(14.08.2013 в 10:03)
| | Все на много сложнее.
Во первых поиск ведется по всем условиям сразу, а не сначала по одному, потом по другому.
Во вторых Перед поиском включается оптимизатор, который пытается уменьшить количество условий... В мане есть очень хорошее описание этого процесса. Не найду сейчас, но суть примерно следующая... Если у вас есть условия:
... WHERE id < 10 AND id < 20 AND id > 15
| то оптимизатор сперва сведет это к
... WHERE id < 10 AND id > 15
| а затем к
и вернет 0 строк ничего не проверяя.
А если у вас есть:
... WHERE id < 10 AND id < 20 AND id > 8
| то, если id - целое оптимизатор к конечном итоге сведет это к
и будет искать по равенству.
В третих сервер посмотрит на наличие индексов, и, если есть подходящие, будет производить поиск по ним.... Но индексирование и поиск по индексам - это уже вообще отдельная, большая и сложная тема. | |
|
|
|
|
|
|
|
для: Sfinks
(14.08.2013 в 14:39)
| | Спасибо за развернутый ответ, буду читать про индексы. | |
|
|
|