В моей базе данных у меня есть таблицы для учетных записей, менеджеров и клиентов. У клиентов и менеджеров есть счета. Здесь существуют две взаимосвязи между учетной записью клиента и учетной записью менеджера. У меня есть учетная запись как FK в таблицах клиентов и менеджеров. Проблема в том, что теперь ничто не препятствует привязке учетной записи к менеджеру и клиенту одновременно. Как мне создать такое отношение или как я должен реализовывать эту вещь.Одна таблица с двумя отношениями один к одному SQL
ответ
Отметьте каждую учетную запись тип счета. Этот столбец может иметь ровно одно значение для данной учетной записи.
Затем сделайте каждый тип учетной записи привяжите себя к определенному типу учетной записи.
CREATE TABLE Managers (
account_id INT PRIMARY KEY,
account_type TINYINT NOT NULL DEFAULT 1,
FOREIGN KEY (account_id, account_type)
REFERENCES Accounts(account_id, account_type)
);
CREATE TABLE Customers (
account_id INT PRIMARY KEY,
account_type TINYINT NOT NULL DEFAULT 2,
FOREIGN KEY (account_id, account_type)
REFERENCES Accounts(account_id, account_type)
);
Это устанавливает по умолчанию, но это не мешает неправильные данные, например, делая строку в Управляющих ACCOUNT_TYPE 4. Чтобы установить это ограничение, вы можете использовать триггер, или СНЕСК или внешний ключ к маленькому столу с одним значением.
Re ваш комментарий:
Как это работает в том, что сначала вставить строку в учетной записи, и вы выбираете ACCOUNT_TYPE:
INSERT INTO Accounts (account_id, account_type) VALUES (123, 1);
Теперь эта строка может ссылаться только строка с account_type = 1.
Если вы вставляете строки только в Менеджеры с именем account_type = 1 и никогда не вставляете строки в Клиенты с этим типом account_type, то в строке в Accounts должен быть указан только менеджер.
-- First example: works fine
INSERT INTO Managers (account_id, account_type) VALUES (123, 1);
-- Second example: wrong account_type for the Customers table
INSERT INTO Customers (account_id, account_type) VALUES (123, 1);
-- Third example: foreign key error, because Account 123 does not have account_type=2
INSERT INTO Customers (account_id, account_type) VALUES (123, 2);
клиенты и менеджеры имеют свои собственные первичные ключи
Это не имеет значения. Я использовал account_id как первичный ключ в моем примере, но это необязательно. Если у вас другой столбец первичного ключа, он все равно работает. Например:
CREATE TABLE Managers (
id INT AUTO_INCREMENT PRIMARY KEY,
account_id INT NOT NULL,
account_type TINYINT NOT NULL DEFAULT 1,
FOREIGN KEY (account_id, account_type)
REFERENCES Accounts(account_id, account_type)
);
- 1. Одна таблица или много таблиц с отношениями
- 2. Соединения «один-к-одному» SQL
- 3. Таблица сущностей Entity Framework с несколькими необязательными отношениями один к одному
- 4. Связывание формы Laravel с отношениями один к одному
- 5. Вставка данных с отношениями один к одному - realm
- 6. Проблема с EF CF и существующими отношениями «один-к-одному»
- 7. Один-к-одному царство с новыми Живыми обратными отношениями
- 8. Связь базы данных MySQL одна-к-одному
- 9. SQL Server: получить все внешние ключи с отношениями «один к одному» и «один ко многим»
- 10. Динамически создаваемые таблицы или одна таблица с отношениями
- 11. Как присоединиться к нескольким столам с отношениями один к одному в рельсах
- 12. отношения один к одному между двумя моделями?
- 13. Яркое отношение один к одному с двумя настраиваемыми полями
- 14. Создать один-к-одному T-SQL
- 15. Определение отношения «один-к-одному» SQL
- 16. Отношения «один-к-одному»
- 17. FluentNHibernate один-к-одному
- 18. Отношения один к одному
- 19. SQL отношения один к одному vs flattening
- 20. GSON отношение один к одному
- 21. ASP.NET MVC Один-к-одному
- 22. Одна таблица, один запрос, одна форма - несколько пользователей
- 23. SQL-таблица с двумя столбцами SQL:
- 24. Проект Sql с метаданными домена: две таблицы (один к одному) или одна таблица, представляющая различные виды данных?
- 25. accepts_nested_attributes_for с двумя отношениями к одной таблице
- 26. Разница между отношениями «один к одному» и «один ко многим» в базе данных
- 27. Один внешний ключ с двумя ссылками Таблица
- 28. Доступ к таблице отношений один к одному
- 29. Excel - удалить все строки «один-к-одному» между двумя столбцами
- 30. NHibernate один-к-одному
хорошо спасибо за ваш ответ. но у клиентов и менеджеров есть свои первичные ключи, и я думаю, что это будет подходящим. объясним далее, как это могло бы предотвратить такую вещь? –
Не должны ли ваши таблицы 'Customers' и' Managers' быть фактически 'Customer_Accounts' и' Manager_Accounts'? В противном случае, как клиенты и менеджеры могут иметь несколько учетных записей? – RBarryYoung
@RBarryYoung, ОП описал отношения «один к одному», а не отношения «один ко многим». –