Дизайн базы данных связан с суррогатным ключом

Сначала я хочу иметь возможность обновлять все атрибуты / поля и не существует единого уникального ключа. У меня есть иерархия, например, каждый компьютер может быть отнесен к категории PC1 / PC2 / PC3 не может служить примером, и каждый компьютер имеет информацию о сети и программном обеспечении. Дизайн и примеры

Parent Table PC(EmpName, PCName, HostName,.... PhysicalLocation, PCType) EMPName,PCName,PCType вместе делают эту таблицу уникальной.

Пример записи ('XYZ', 'Work Laptop','XYZ-PC',.....,'DESK-123','PC1')

Дочерний стол PCNetwork(EmpName, PCName, HostName,IPAddr,....,PhysicalLocation,PCType)

example record1 ('XYZ', 'Work Laptop','XYZ-PC','0.0.0.0',....,'DESK-123','PC1')

example record2 ('XYZ', 'Work Laptop','XYZ-PC','0.0.0.1',....,'DESK-123','PC1')

Поскольку я хочу, чтобы все поля можно было изменять, я добавил столбец Surrogate Key Id в оба. Я использовал PC-Id в качестве таблицы FK to Network, но при вставке мне пришлось бы написать запрос, чтобы получить Id из таблицы ПК.

Есть две проблемы: если я использую естественный / составной ключ, я не могу обновлять каждую запись, поскольку обновления выполняются через Asp.Net Gridview, который не позволяет обновлять первичный ключ.

Если я использую суррогатный ключ, существует вероятность дублирования записей, и я не могу ссылаться на них или накладывать ограничение внешнего ключа на другие поля, поскольку они могут быть уникальными только путем объединения всех трех полей.

Я использую SQL Server 2008 и ASP.Net 4.0

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


person scc    schedule 03.04.2013    source источник
comment
если я использую естественный / составной ключ, я не могу обновлять каждую запись, поскольку обновления выполняются через Asp.Net Gridview, который не позволяет обновлять первичный ключ. Почему вы так думаете?   -  person Conrad Frix    schedule 04.04.2013
comment
Поскольку я пытался и не смог обновить первичные ключи, он просто обновляет другие поля, но не первичные ключи, и в некоторых сообщениях также говорится, что обновление Gridview работает с pk в предложении where, где, когда я меняю этот pk и использую этот pk в качестве условия .   -  person scc    schedule 04.04.2013
comment
Gridviews отвечают только за отображение и обновление объектов источника данных, к которым они привязаны. Они не обновляют базы. Теперь вполне возможно, что ваш источник данных не сохраняет старые значения, что делает невозможным обновление первичного ключа, но это не ошибка GridView.   -  person Conrad Frix    schedule 04.04.2013
comment
Да, это правда, старые значения не обрабатываются, но я не уверен, чья это вина, поэтому я решил использовать вместо них суррогатные ключи.   -  person scc    schedule 04.04.2013


Ответы (1)


Если я использую суррогатный ключ, существует вероятность дублирования записей, и я не могу ссылаться на них или накладывать ограничение внешнего ключа на другие поля, поскольку они могут быть уникальными только путем объединения всех трех полей.

У вас может быть суррогатный ключ, и при этом оба исключают возможность дублирования и создают реляционное ограничение. Начните с того, что отметьте ключевые столбцы кандидатов как уникальные:

alter table PC
add constraint UK_PC_EMPName_PCName_PCType
unique (EMPName, PCName, PCType);

Затем вы можете добавить свой внешний ключ следующим образом:

alter table PCNetwork
add constraint FK_PC_PCNetwork
foreign key (EMPName, PCName, PCType)
references PC (EMPName, PCName, PCType);

Однако я должен сказать, что я не совсем понимаю вашу схему, как описано, поэтому я не уверен, есть ли лучший способ моделирования ваших данных. Тем не менее, вот некоторые наблюдения:

  • На первый взгляд PhysicalLocation и PCType кажутся избыточными данными. Вы должны решить, к какому столу они подходят лучше всего.
  • У вас может быть столбец в PCNetwork, ссылающийся на ваш суррогатный ключ в PC, поэтому вам не понадобится EmpName, PCName, HostName в PCNetwork (но все же создайте уникальный ключ в PC).
person Tim Lehner    schedule 03.04.2013
comment
Что делать, если у меня есть нулевые значения в PCName (которые у меня есть)? Я забыл добавить, так как у меня есть 3 типа ПК, которые у ПК2 нет (я имею в виду, что он не нужен) атрибута PCName, поэтому я скрываю его при вставке, поэтому он получает значение null, но все же записи уникальны, и это поле также имеет значение null. Спасибо за ответ. - person scc; 04.04.2013
comment
Пока ваш уникальный ключ еще не нарушен в ваших данных (включая нули), это будет работать нормально. Все поля могут иметь значение NULL в уникальном ключе и любом соответствующем внешнем ключе. Однако вы не можете создать первичный ключ, используя какие-либо столбцы, допускающие значение NULL. - person Tim Lehner; 04.04.2013
comment
Я получаю эту ошибку The ALTER TABLE statement conflicted with the FOREIGN KEY constraint FK_PC_PCNetwork The conflict occurred in database "test.mdf" table "dbo.PC" - person scc; 04.04.2013
comment
Если ваш уникальный ключ отлично создан на PC, у вас, вероятно, есть данные в PCNetwork, которых нет в PC. - person Tim Lehner; 04.04.2013
comment
Вау! Я думал о том же, большое вам спасибо. Позвольте мне протестировать, удалив эти лишние данные. - person scc; 04.04.2013
comment
Спасибо за помощь, я не знал, что могу создавать составные уникальные ключи и использовать их как fk. Узнал что-то новое, и это сработало очень хорошо, я могу обновлять поля, и ссылки тоже работают. Еще раз спасибо!! - person scc; 04.04.2013
comment
Привет, у меня проблема, у меня есть два новых столбца для обеих таблиц, и они являются частью отношения fk, и теперь уникальное ограничение работает, но не ограничение fk, например, при вставке, оно не проверяет, существуют ли данные в таблице ПК. При каскадном удалении обновление тоже не работает. Я добавил уникальный индекс, думая, что у меня больше пустых полей, но это тоже не помогло. Любая помощь? - person scc; 09.04.2013
comment
@scc Я бы предложил открыть новый вопрос со всей этой информацией в вашем примере. Кроме того, чем ближе вы подойдете к вопросу о чистом дизайне БД, тем лучше вы сможете справиться с dba.stackexchange.com. - person Tim Lehner; 09.04.2013
comment
ya Я подумал о том, чтобы открыть новый вопрос, но технически тот же вопрос, так как у меня только что было два новых поля, и ограничения тоже есть, но не работают. - person scc; 09.04.2013
comment
привет, это новый вопрос, ссылка - person scc; 17.04.2013