2016-04-13 3 views
0

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

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

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

До сих пор моя схема:

  • service (serviceCode, описание, serviceFee)
  • appointment ([appDate, clientNo, serviceCode] PK, roomNo)
  • invoice (invNo, invDate, totalFee , комментарий, статус, [appDate, clientNo, serviceCode] FK)

Возможно ли это? Хотя я полагаю, что мне нужно добавить serviceFee в качестве части первичного ключа служб, чтобы я мог передать его на счет-фактуру, так как я не уверен, могу ли я отдельно передать serviceFee только на счет-фактуру.

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

ответ

0

Я не уверен в SQLLITE. В SQL Server вы можете сделать это как.

CREATE TABLE [dbo].[service](


    [serviceCode] [int] IDENTITY(1,1) NOT NULL, 
    [description] [varchar](max) NULL, 
    [servicefee] [float] NULL, 
CONSTRAINT [PK__service__3213E83F014935CB] PRIMARY KEY CLUSTERED 
(
    [serviceCode] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
CREATE TABLE [dbo].[appointment](
    [appDate] [datetime] NOT NULL, 
    [clientNo] [int] NOT NULL, 
    [serviceCode] [int] NOT NULL, 
    [roomNo] [float] NOT NULL, 
CONSTRAINT [PK__appointment__3213E83F014935CB] PRIMARY KEY CLUSTERED 
(
    [serviceCode] ASC, 
    [appDate] ASC, 
    [clientNo] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
CREATE TABLE [dbo].[invoice](
(invNo, invDate, totalFee, comment, status, [appDate, clientNo, serviceCode]FK 
    [invDate] [datetime] not NULL, 
    [invNo] [int] not NULL, 
    [totalFee] [float] not null, 
    [comment] [varchar](max), 
    [status] [varchar](max), 
    [appDate] [datetime] NULL, 
    [clientNo] [int] NULL, 
    [serviceCode] [int] NULL 
) ON [PRIMARY] 
GO 
/****** Object: ForeignKey [FK_appointment_service] Script Date: 04/13/2016 10:43:41 ******/ 
ALTER TABLE [dbo].[appointment] WITH CHECK ADD CONSTRAINT [FK_appointment_service] FOREIGN KEY([serviceCode]) 
REFERENCES [dbo].[service] ([serviceCode]) 
GO 
ALTER TABLE [dbo].[appointment] CHECK CONSTRAINT [FK_appointment_service] 
GO 
/****** Object: ForeignKey [FK_invoice_appointment] Script Date: 04/13/2016 10:43:41 ******/ 
ALTER TABLE [dbo].[invoice] WITH CHECK ADD CONSTRAINT [FK_invoice_appointment] FOREIGN KEY([serviceCode], [appDate], [clientNo]) 
REFERENCES [dbo].[appointment] ([serviceCode], [appDate], [clientNo]) 
GO 
ALTER TABLE [dbo].[invoice] CHECK CONSTRAINT [FK_invoice_appointment] 
GO 
+0

Да, лучше всего было бы создать дополнительные таблицы для решения проблемы. Это единственный способ для меня иметь дело с многозначными атрибутами. – JCook

0

Да, вы можете иметь составной ключ как ПК и FK.

Перейти к SQLLITE Foreign Key Definition и искать «Составной внешний ключ»

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

Вы должны использовать одно поле в качестве PK, это может быть IDENTIY, GUID или что-то еще. Для вашего случая у вас будет большая проблема с этим дизайном

+0

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

Смежные вопросы