Таблица MYSQL со статическими и динамическими значениями
На моем сайте я создаю функцию счета. Счет-фактура содержит статическую информацию: информацию о компании и информацию о получателе. Но он также имеет динамическую информацию: количество часов, описание, общую сумму и т. Д. Клиенты могут добавить несколько строк с динамической информацией выше.
Теперь мой вопрос: как я могу реализовать это в моей базе данных?
На данный момент у меня есть таблица с именем "invoice", со столбцами, в которых будет вся информация, указанная выше. Но в этом случае строки будут содержать ненужную информацию, такую как информация о компании и получателе, которая фактически должна быть вставлена только один раз для каждого счета.
Как вы, ребята, думаете, что мне придется решить это?
Я хотел бы избежать использования 2 таблиц, но если нет другого варианта, то я буду.
Привет
2 ответа
Если вам нужна полностью реляционная база данных, вам нужно будет создать вторую таблицу. Это будет содержать информацию о клиенте. Затем этот ключ становится внешним ключом в вашей таблице счетов-фактур, поэтому вы можете хранить информацию о клиенте только один раз. Это был бы рекомендуемый способ реализации чего-то подобного.
Другой способ (и я не рекомендую это) заключается в том, что вам необходимо создать циклическую ссылку на "родительский" счет-фактуру (тот, который хранит информацию о клиенте). Затем каждый раз, когда вы создаете новый счет-фактуру, вам нужно будет вставить этот идентификатор родительской записи, чтобы у вас был способ извлечь сохраненную информацию. Для всех других счетов того же клиента вы просто оставляете эту информацию пустой.
Выберите выписку для каждой базовой таблицы
Ваше желание иметь только один стол неосведомлен и опрометчив.
Каждая таблица содержит базовое утверждение о ситуации в приложении. Строки, которые делают утверждение истинным, попадают в таблицу.
ivoice(i,c,...) // invoice [i] is to company [c] with ...
company(c,n,a,...) // company [c] has name [n] and address [a] ...
receiver(r,...) // receiver [r] ...
Таким образом, каждая существующая строка делает истинное утверждение (или оно будет отсутствовать), а каждая отсутствующая строка делает ложное утверждение (или оно будет присутствовать). Таким образом, вы можете думать о таблице как о создании операторов из существующих строк плюс NOT операторов из отсутствующих строк. Вместе базовые таблицы описывают ситуацию вашего приложения.
Ограничение "И" в операторах базовой таблицы
Основная идея состоит в том, чтобы удалить большинство AND из ваших утверждений. Если оператор таблицы является оператором AND небольших операторов, то они всегда должны быть такими:
(1) something AND-free about [k1],...
где каждое подстрока в столбцах k1,... является уникальным в таблице и не содержит меньшего подстроки, или как:
(2) [c]=some_function_of_all_of(k1,...)
(Это называется "5-ая нормальная форма".)
Зачем ограничивать "И"?
Потому что в противном случае ваша таблица будет иметь проблемное утверждение, сделанное из одного из этих более простых, таких как:
blah [k1] blah [k2] AND blub [j1]
Когда "бла ZZ бла 88" является истинным или ложным, вам, как правило, придется помещать не одну, а несколько строк в или из этой таблицы, в соответствии с истинностью "blub [j1]" для каждого возможного j1 значение. (Это называется аномалией обновления.)
Кроме того, вполне вероятно, что вы хотите сказать, что "бла-VV-бла-999" является истинным или ложным (в таблице или вне таблицы) без ворчания о j1s. Но выбранный вами стол не позволит вам. (Это называется неправильный дизайн.)
PS: есть запрос на запрос
Каждое выражение запроса также имеет оператор. Значением запроса являются строки, которые делают его утверждение истинным. Комбинирование таблиц с помощью операторов отношений для создания запроса объединяет операторы с помощью логических операторов для создания своего запроса. JOIN, ON и WHERE для таблиц выполняет операторы AND, UNION для таблиц выполняет операторы OR, SELECT выполняет THERE IS и т. Д. Поэтому, когда вы выполняете запрос, вы строите более сложные операторы из операторов базовой таблицы.
// there is a name n,... where:
// invoice [i] is to company [c] and ...
// AND company [c] has name [n] and address [a] ...
SELECT i,c,a FROM company JOIN invoice ON company.c=invoice.c