Несколько внешних ключей к отдельному столбцу

Вы хотите 3+ подчиненные машины с хозяином вне радиационной обстановки. Все операции ввода / вывода проходят через мастер, который содержит механизм голосования и / или повторных попыток. У ведомых устройств должен быть аппаратный сторожевой таймер, и вызов для их повышения должен быть окружен CRC или чем-то подобным, чтобы уменьшить вероятность непроизвольного столкновения. Удар должен контролироваться ведущим, поэтому потерянное соединение с главным равняется перезагрузке в течение нескольких секунд.

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

Редактировать: Из комментариев я чувствую необходимость прояснить «идею CRC». Вероятность того, что ведомое устройство ударит свой собственный сторожевой таймер, близка к нулю, если вы окружите удар с помощью CRC или дайджест-проверок случайных данных от мастера. Эти случайные данные отправляются только от ведущего, когда подчиненное устройство находится под контролем других. Случайные данные и CRC / дайджест немедленно очищаются после каждого удара. Частота удара ведущий-ведомый должна быть более чем вдвое тайм-аутом сторожевого устройства. Данные, отправляемые мастером, генерируются уникальным образом каждый раз.

25
задан Aaron Powell 27 July 2009 в 07:43
поделиться

5 ответов

Нет, нельзя использовать одно поле в качестве внешнего ключа для двух разных таблиц. Как бы вы сказали, где искать ключ?

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

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

25
ответ дан 28 November 2019 в 21:39
поделиться

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

CustomerA <---- CustomerA_Orders ----> Order
CustomerB <---- CustomerB_Orders ----> Order

Итак, Order даже не имеет внешний ключ; желательно ли это ...

4
ответ дан 28 November 2019 в 21:39
поделиться

You can create a foreign key referencing multiple tables. This feature is to allow vertical partioining of your table and still maintain referential integrity. In your case however, this is not applicable.

Your best bet would be to have a CustomerType table with possible columns - CustomerTypeID, CustomerID, where CustomerID is the PK and then refernce your OrderID table to CustomerID.

Raj

1
ответ дан 28 November 2019 в 21:39
поделиться

Two distinct types of customer is a classic case of types and subtypes or, if you prefer, classes and subclasses. Here is an answer from another question.

Essentially, the class-table-inheritance technique is like Arnand's answer. The use of the shared-primary-key technique is what allows you to get around the problems created by two types of foreign key in one column. The foreign key will be customer-id. That will identify one row in the customer table, and also one row in the appropriate kind of customer type table, as the case may be.

0
ответ дан 28 November 2019 в 21:39
поделиться

Как уже отмечалось, если ключ, скажем, 12345 , как узнать, в какой таблице искать? Я полагаю, вы могли бы сделать что-то, чтобы гарантировать, что ключевые значения для двух таблиц никогда не перекрываются, но это слишком уродливо и болезненно, чтобы об этом думать. У вас может быть второе поле, в котором указано, какой это тип клиента. Но если у вас будет два поля, почему бы не иметь одно поле для идентификатора клиента типа 1, а другое - для идентификатора клиента типа 2.

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

Моя первая мысль заключается в том, что вам действительно нужно иметь общую таблицу клиентов с данными, которые являются общими для обоих, а затем иметь две дополнительные таблицы с данными, специфичными для каждого типа клиентов. Я думаю, что у них должно быть много общих данных - по крайней мере, такие как имя, адрес и номер клиента - а повторение столбцов в таблицах - отстой. Затем дополнительные таблицы могут ссылаться на базовую таблицу. Поскольку тогда для базовой таблицы существует единственный ключ, исчезает проблема внешних ключей, которые должны знать, к какой таблице обращаться.

Моя первая мысль заключается в том, что вам действительно нужно иметь общую таблицу клиентов с данными, которые являются общими для обоих, а затем иметь две дополнительные таблицы с данными, специфичными для каждого типа клиентов. Я думаю, что у них должно быть много общих данных - по крайней мере, такие как имя, адрес и номер клиента - а повторение столбцов в таблицах - отстой. Затем дополнительные таблицы могут ссылаться на базовую таблицу. Поскольку тогда для базовой таблицы существует единственный ключ, исчезает проблема внешних ключей, которые должны знать, к какой таблице обращаться.

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

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

0
ответ дан 28 November 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: