Любой из них будет работать для вашей таблицы ПРОДУКТОВ:
table: PRODUCTS1
id autoincrementing integer primary key
company int
product int
productname
etc
with a unique composite index on (company,product)
или
table: PRODUCTS2
company int
product int
productname
(company, product) composite primary key
Но если вы создаете составной первичный ключ, все внешние ссылки на этот составной PK также должны быть составными, состоящими из двух столбцов. Для заказов, например, для ссылки на продукт потребуется два столбца:
table: OrderDetail
orderdetailid int pk
orderheaderid int --foreign key references ORDERHEADER(id)
company
product
quantity
etc
-- foreign key (company,product) references PRODUCTS2(company,product)
но это будет проще для запросов и в коде графического интерфейса пользователя:
table: OrderDetail
orderdetailid int pk
orderheaderid int --foreign key references ORDERHEADER(id)
productid --here the foreign key references PRODUCTS1(id)
quantity
etc
Я не уверен, что вы подразумеваете под
Я не хочу вводить другой столбец с уникальной записью
идентификатор, потому что я хочу, чтобы эти правила применялись без создания
уровень C #, проверяющий целостность.
Эти ограничения / индексы могут быть созданы в самой базе данных, и база данных будет применять правила; ваша клиентская программа на C # не будет применять эти правила, а просто сообщит об ошибках, сгенерированных базой данных, когда будут предприняты попытки нарушить правила Первый подход, PRODUCTS1, где у вас есть отдельный первичный ключ с автоинкрементом, дает вам простой дескриптор строки, а также обеспечивает соблюдение желаемого правила уникальности из двух столбцов. Это обычная практика.