Microsoft Access не может создать первичный ключ - PullRequest
0 голосов
/ 27 ноября 2018

Я очень плохо знаком с базами данных.У меня есть проект, который я должен сделать, который в основном восстанавливает эту базу данных, это огромный беспорядок.Соглашения о недопустимых именах, ненормализованные и т. Д.

Я пытаюсь назначить PK для поля, но не могу, потому что access выдает ошибку, сообщающую, что значения являются дубликатами.

Я должен положить эту таблицу в 1NF, а затем перейти к 3NF.

Поле в этой таблице называется "WarehouseID" и "CustomerID"

Проблема заключается в том, что проект хочет, чтобы некоторые данные оставались такими же, как warehouseID и customerID, а warehouseID используется несколько раз более одного раза.

Пример:

WarehouseID

WH1

WH1

WH2

WH2

WH2

CustomerID

1

2

3

3

4

5

5

Таблица уже в 1NF, но я не могу назначить PK для поля "WarehouseID", потому что он имеет несколько значений.

Даже когда я пытаюсь сделать эту таблицу 2NF, я не могу сделать PK вотдельные таблицы, потому что я все равно получу следующий результат

WarehouseID

3

3

4

4

5

5

8

Я не слишком уверен, что делать.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Добавьте поле автонумерации - затем укажите его как PK.

Очевидно, что любое поле с дубликатами не может быть полем PK - так что вы захотите разобраться с этим каким-то образом.Одна идея - создать новую таблицу со списком DISTINCT для этого поля.А затем сделайте эту новую таблицу главной, а существующую - дочерней.Просто идея неуместна - и может не подойти в вашей ситуации.

Я советую, чтобы все активные таблицы транзакций использовали только поля PK с полями автонумерации - хотя не все согласны с этой философией проектирования.Только не статические таблицы списка, т. Е. Список состояний, подходят для неумеренных полей PK.

0 голосов
/ 29 ноября 2018

Имейте в виду, что для данной таблицы PK будет ВСЕГДА встречаться один раз.

Каждая таблица должна иметь PK, и они не будут использоваться в качестве PK в любой другой таблице.

Итак, у вас может быть таблица Warehouse.

У нее может быть PK WarehoueID

И у вас может быть таблица с именем Customer, и у нее может быть PK с именем CustomerID..

Далее: Если вы ВСЕГДА назначаете одного клиента для данного склада, просто добавьте столбец в таблицу клиентов с именем warehouseID.Однако этот столбец НЕ является ПК.Это столбец длинных чисел «самолет Джейн».В этом столбце наверняка будут разрешены дубликаты.

Единственная реальная проблема, с которой вы здесь сталкиваетесь, может иметь клиент или использовать более одного склада?

Можно ли назначить более одного склада данному клиенту?

Ну, тогда вам просто нужно создать таблицу или «список» складов, которые клиент может использовать.

Если это так, то вам нужна таблица с именем:

CustomerListOfWareHouses.

Приведенная выше таблица будет просто «списком» складов, которые использует данный клиент.Если это именно то, что вам нужно, то вам НЕ нужен storeID вообще в таблице клиентов.

У вас есть

tblCustomes
   --->tblCustomerListOfWareHouses

Так что tblcustomerListOfWareHouses будет тем, что мы называем дочерней таблицей.

В этой таблице у вас будет PK (ListOfWareHousesID), а затем вы сможете установить, кому принадлежит эта запись (customerID), а затем установить используемый ими склад (WareHouseID).

Итакэтот «список» складов будет выглядеть так:

ListOfWareHousesID   (PK)
CustomerID           (plane jane long number colum)
WarehouseID          (plane jane long number colum)
Date of Enter       (date column, when created)
Who Authorized       (person that approved use of warehouse).
“and perhaps a few ore columns if  you want or need).

А затем 3-я таблица складов.В этой конфигурации вы фактически НИКОГДА не присоединяете склад к данному клиенту, а просто располагаете таблицей, которая «перечисляет» склады, которые использует клиент.

Это предполагает, что каждый клиент может использоватьи иметь «много» склад.

Таким образом, вы никогда не прикрепляете склад к клиенту.Все, что вы действительно делаете, это «перечисляете» в таблице склады, которые использует клиент (tblCustomerListOfWareHouses).

Так что это означает, что таблица клиента и таблица склада НИКОГДА не связаны друг с другом, инет никаких принудительных отношений между клиентами и складами.

Ваша модель данных «позволит» вам присоединить «много» складов к одному клиенту, но на самом деле все, что вы действительно делаете, - это «перечисляете» склады, которые есть у клиента, добавляя записи в «списоксклады », которыми пользуется клиент (tblCustoerListOfWareHouses).

Конечно, если клиент может использовать ТОЛЬКО и иметь один склад?Ну, тогда просто добавьте столбец в таблицу клиентов с именем WareHouseID и просто введите значение «id» для этого одного клиента, чтобы присоединить этого клиента к одному складу.(поэтому вам не понадобится «список складов», потому что им разрешено использовать только один склад).

Как уже отмечалось, вам нужен «список» складов, только если клиент может использовать и иметь болееодин склад.

Таким образом, каждая запись склада будет иметь PK, как и каждый клиент.Но ничто не указывает на наличие дубликатов на данный момент.

Если клиент может использовать только один склад, добавьте этот простой столбец в таблицу клиентов, в которой находится склад.И это плоский столбец Джейн - многие клиенты могут использовать один и тот же склад, и этот столбец, скорее всего, будет содержать дубликаты.

...