Вопрос № 172482: Здравствуйте, уважаемые эксперты! Пожалуйста помогите ответить на мой вопрос: Я проектирую БД склада на СУБД Access: Товар на складе хранится в коробках. Каждая коробка имеет уникальный номер. В каждой коробке может хранится несколько тов...
Вопрос № 172482:
Здравствуйте, уважаемые эксперты!
Пожалуйста помогите ответить на мой вопрос: Я проектирую БД склада на СУБД Access: Товар на складе хранится в коробках. Каждая коробка имеет уникальный номер. В каждой коробке может хранится несколько товаров, каждый товар может храниться в нескольких коробках. Склад состоит из ячеек - каждая ячейка имеет уникальный номер. В каждой ячейке может стоять только одна коробка. Коробки могут не стоять ни в какой ячейке. Ячейки могут быть пустыми.
У меня в итоге
получилось 4 таблицы: 1. Товары (Номер товара-ключ.поле, НАзвание товара) 2. Коробки (Номер коробки - ключ.поле,Комплектовщик) 3. Ячейки склада (Номер ячейки - ключ. поле) 4. Товары в коробках (Номер коробки-ключ, Номер товара -ключ,Количество товара)
Таблицы 'Товары' и 'Коробки' связаны через промежуточную таблицу 'Товары в коробках' одно-многозначными связями. А вот каким образом связать 'Коробки' и 'Ячейки'
; я не могу понять. По смыслу между этими таблицами должна быть связь один-к-одному (в одной ячейке может находиться только одна коробка). Но если добавлять из одной таблицы ключевое поле в другую таблицу в качестве внешнего ключа, то получается связь один-ко многим. Если реализовывать связь через промежуточную таблицу 'Размещение коробок' то связь между этими таблицами получается много-многозначная'. Пожалуйста, подскажите, как правильно решить этот вопрос.
Мне кажется, судя по условиям задачи, получается, что таблица "Коробки" может иметь поле "Номер ячейки" (может иметь значение или быть NULL).
Что касается таблицы "Ячейки", то она, кроме номера ячейки (ключевое поле) должна содержать какие-то характеристики ячеек (а иначе она, вроде бы, не нужна; можно будет создать такое представление на основе других таблиц).
Если же есть строгое условие, что в одной ячейке должно стоять не
больше одной коробки, то, наоборот, можно в таблице "Ячейки" создать поле "Номер коробки" (которая в ней стоит), а в таблице "Коробки" тогда поле "Номер ячейки" добавлять не нужно.
Если я что-то не точно понял вопрос, напишите, пожалуйста, уточнение в мини-форуме.
Успехов Вам!
----- Труднее всего починить то, что никогда не ломается
#thank 254523
на номер 1151 (Россия) |
Еще номера »
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Отвечает Филатов Евгений Геннадьевич, Студент :
Здравствуйте, Alexey Sergeev. Может сделать немного по-другому? Это добавит дублирующуюся информацию в таблицы, но станет проще получать информацию о текущем состоянии.
Yach ( Ячейка ) данные о текущих ячейках и их загрузке Kod ключ, код ячейки Kor код помещенной в ячейку коробки, если пустая =0 Name наименование ячейки ( шифр, инвентарный номер или ч-л подобное, вдруг пригодится )
Kor ( Коробок ) данные о коробках Kod ключ, код коробки Yach код ячейки,
в которую помещен коробок, если никуда =0 Kompl комплектовщик ( лучше код комплектовщика и добавить таблицу для них ) Name наименование коробки ( шифр, инвентарный номер или ч-л подобное )
Tov ( Товар ) справочник товаров Kod ключ, код товара Name наименование
Skl ( Склад ) данные о паковке товаров в коробки Kor код коробки Tovar код товара Kol количество товара в коробке в теории, здесь хранится текущее состояние упа
ковок, поэтому старые данные удаляются.
я бы еще добавил справочник партий товара. это усложнит базу, но можно будет отследить какие старые товары не были использованы и почему вместо них использовались товары из нового поступления. Part ( Партия ) Kod код партии Tov код товара Dpost дата поступления Kol количество Ostat остаток на складе ( можно придумать еще поля )
тогда справочник склада немного изменится Skl ( Склад ) данные о паковке товаров в коробки Kor
код коробки ( в теории, не может быть =0 , т.к весь товар расфасован в коробки, но ошибкой не будет - напишет "без коробки" если добавить пустые записи как написано в примечании ниже ) Part код партии товара ( не может быть =0 ) Kol количество товара в коробке ( не может быть =0 , иначе нужно удалить запись )
За счет дублирования информации в двух таблицах о заполнении ячеек коробками и о загрузке коробок в ячейки, отпадает необходимость
в связи между ними. Ключевые поля лучше делать длинное целое, но не счетчик, а заполнять это поле вручную ( сначала найти максимальное значение в таблице и новой записи присвоить на единицу больше ) . Еще было бы неплохо добавить "нулевые записи" в справочники ( значение ключа =0 ) : Yach ( 0 , 0 , "без ячейки" ) Kor ( 0 , 0 , 0 , "без коробки" ) Tov ( 0 , "не выбран" ) чтобы при связи таблиц не выпадали строки, в которых второй ключ =0 ( если ячейка пустая
или коробка не в ячейке )
Не знаю как там прямо в Access, я работаю через клиентское приложение на VB. Вот примеры запросов
Текущее состояние ячеек ( если ячейка свободна - во втором поле будет "без коробки" ) select y.Name,k.Name from yach y inner join kor k on k.kod=y.kor
Занятые ячейки select y.Name,k.Name from yach y inner join kor k on k.kod=y.kor where y.kor>0
Текущее состояние коробок ( где находятся, может быть &
quot;без ячейки" ) select k.Name,y.Name from kor k inner join yach y on y.kod=k.yach
Занятые коробки select k.Name,y.Name from kor k inner join yach y on y.kod=k.yach where k.kod in ( select kor from skl group by kor )
Состояние коробок ( наличие в них товара и его количество ) select k.Name, y.Name, t.Name, sum ( s.kol ) as [kol] from ( ( ( kor k inner join yach y on y.kod=k.yach ) inner join skl s on s.kor=k.kod ) inner join part p on p.kod=s.part ) inner join tov t on t.kod=p.tov
group by k.Name, y.Name, t.Name это теоретически. реально запрос не проверял.
Фактически, все селекты это дополнительные таблицы для удобства отображения данных ( вкладка View в базе ) .
Если создатите базу и заполните данными, то можете отправить на адрес jones@hte.vl.net.ua и написать, какие еще запросы нужны - напишу в ответе.
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.