Всем привет!
Объясняю вкратце: к примеру есть таблицы Товары и Чеки. Как понятно, в одном чеке должно быть много позиций с РАЗНЫМИ товарами. Как это организовать? Ведь если в таблице Чеки, создать столбец "Товар", и связать его с таблицой "Товары", то в одном чеке сможет быть только 1 товар.. .
Таблица ЧЕКИ
Номер чека - int primary key
Номер товара - int foreign key
Дата и время - datetime
Таблица ТОВАРЫ
Номер товара - int primary key
Наименование товара - varchar(35)
Цена товара - int
А надо, чтобы в одном чеке был один номер, одна дата, но много разных товаров! Заранее спасибо за помощь!
Другие языки программирования и технологии
Организация БД в MS SQL
Суб таблица с товарами и индентификатором чека (номером)
И по номеру чека соостветственно присваивать код товара или сам товар.
Потом фильтровать по номеру чека и получать список для этого чека
Либо добавить блоб поле и туда товар пихать но это не корректно
И по номеру чека соостветственно присваивать код товара или сам товар.
Потом фильтровать по номеру чека и получать список для этого чека
Либо добавить блоб поле и туда товар пихать но это не корректно
правильный ответ у DEN
хотя помещать идентификационный номер товара в чеки тоже покатило бы. просто использовать composite primary key (номер чека + номер товара)
Alex, вы ещё большую бессмыслицу говорите. если делать как вы сказали, то каждое наименование товара может быть связано только с одним чеком. или возможно что вы считаете что каждая единица товара в базу заносится отдельно. тогда у вас дело обстоит ещё хуже.
хотя помещать идентификационный номер товара в чеки тоже покатило бы. просто использовать composite primary key (номер чека + номер товара)
Alex, вы ещё большую бессмыслицу говорите. если делать как вы сказали, то каждое наименование товара может быть связано только с одним чеком. или возможно что вы считаете что каждая единица товара в базу заносится отдельно. тогда у вас дело обстоит ещё хуже.
Таблица ЧЕКИ
Номер чека + Номер товара -> primary key
А то у вас больше одного товара в чек не впихнуть :)
Ну а Foreign - вам тут разве что для cons check на update и insert и, возможно, для ON DELETE RESTRICT чтобы нельзя было убить товар пока он есть в чеках. Исходя из опыта по сути вам все-равно как-то придется решать проблемы с переоценками. А варианта всего 2 - переоцененный товар получает новый ID или надо в чек внести цену (а заодно и кол-во) на момент создания чека. Иначе вас бухи сожрут с костьми :) и без хлеба. Выбор зависит от ассортимента и масштабности переоценок. Например - если это курсо-баксопривязаный магазин то переоценки вам обеспечены каждый день. И если на складе N тыс.. . наименований.. . то очень скоро ваша табличка уберемениет до невозможности. А резать ее низя. Ибо потеряется связь со старыми чеками. Второй вариант позволяет "чистить" таблицы закрытием периодов ценой распухания чека.
Номер чека + Номер товара -> primary key
А то у вас больше одного товара в чек не впихнуть :)
Ну а Foreign - вам тут разве что для cons check на update и insert и, возможно, для ON DELETE RESTRICT чтобы нельзя было убить товар пока он есть в чеках. Исходя из опыта по сути вам все-равно как-то придется решать проблемы с переоценками. А варианта всего 2 - переоцененный товар получает новый ID или надо в чек внести цену (а заодно и кол-во) на момент создания чека. Иначе вас бухи сожрут с костьми :) и без хлеба. Выбор зависит от ассортимента и масштабности переоценок. Например - если это курсо-баксопривязаный магазин то переоценки вам обеспечены каждый день. И если на складе N тыс.. . наименований.. . то очень скоро ваша табличка уберемениет до невозможности. А резать ее низя. Ибо потеряется связь со старыми чеками. Второй вариант позволяет "чистить" таблицы закрытием периодов ценой распухания чека.
Обычная связь многое ко многим, всё просто к вашим таблицам добавить ещё одну:
Таблица ЧЕКИ
Номер чека - int primary key
Дата и время - datetime
Таблица ТОВАРЫ
Номер товара - int primary key
Наименование товара - varchar(35)
Цена товара - int
Таблица ЧЕКИ_ТОВАРЫ
номер связи
Номер товара
Номер чека
Таблица ЧЕКИ
Номер чека - int primary key
Дата и время - datetime
Таблица ТОВАРЫ
Номер товара - int primary key
Наименование товара - varchar(35)
Цена товара - int
Таблица ЧЕКИ_ТОВАРЫ
номер связи
Номер товара
Номер чека
Номер товара в таблице ЧЕКИ бессмысленен. В таблице ТОВАРЫ нужна колонка "НОМЕР ЧЕКА", которая и "привяжет" товар к чеку
Похожие вопросы
- Что такое MS SQL сервер?
- Скажите, в каких проектах что лучше использовать MS SQL-сервер, а в каких MS Access??
- PHP (MySQL) vs. ASP.NET (MS SQL) - что выбрать и какое у них будущее?
- куда можно устроится если прилично изучить работу на MS SQL server 2012 ,
- Насколько сложна технически миграция Баз Данных с одной СУБД на другую? Oracle => MS SQL
- Вопрос знатокам MS SQL насчет хранимок - смотрите внутри.
- Перечень допустимых функций в SQL-запросе ADO Jet 4.0 (MS Access)
- SQL, MySQL, PgSQL, NoSQL, Redis Нужно ли для разных СУБД и БД какие-то разные версии языка SQL или она одна на всех?
- Нужна книга-самоучитель по использованию БД SQL в связке с C#
- Собираюсь выучить SQL. Сложный ли он? И где взять учебную БД, чтоб учить на практике?