Problem z kluczem obcym

0

Cześć,
Mam taką sytuację:
Tablica Zadanie: SysZadanie, SysWiadomosc
Tablica Email: SysEmail, Temat, Tresc, Do, itd...
Tablica Sms: SysSms, Text, Numer
Tablica GG: SysGG, Text...

Jest możliwosć połączenia (stworzenia kluczy obcych), SysWiadomosc z SysEmail, potem SysWiadomosc z SysSms i SysWiadomosc z SysGG. Tzn stworzenia 3 kluczy obcych ? Jest to w ogóle możliwe?

Jeżeli nie, to w jaki sposób rozwiązać taki problem? - tj. W tablicy Zadanie w kolumnie SysWiadomosc, będą identyfikatory wszystkich typów zadań. Oczywiście ta kolumna nie jest unikalna.

0

Generalnie nie ma ograniczenia na ilość kluczy obcych, więc tworzysz ich sobie ile Ci potrzeba. Tu masz krótką definicję klucza obcego (http://pl.wikipedia.org/wiki/Klucz_obcy)

0

Wchodze w tabele "Zadanie", dodaje klucz obcy, zaznaczam odpowiednio "SysSmsMessage" z tablicy "SmsMessage" i "SysMessage" z tablicy "Task". Dodaje. Chcę zapisać i taki błąd:

 
'SmsMessage' table saved successfully
'Task' table
- Unable to create relationship 'FK_Task_SmsMessage'.  
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_Task_SmsMessage". The conflict occurred in database "mgdb", table "dbo.SmsMessage", column 'SysSmsMessage'.

Coś jest nie tak z kolumną SysSmsMessage. Jest to zwykła kolumna, int, primary_key w tablicy SmsMessage.

0

Nie ma żadnych ograniczeń ani co do ilości kluczy, ani też co do ilości atrybutów w kluczu. Możesz połączyć wszystko, ze wszystkim pamiętając, że wartość pola w atrybut1 musi być równa wartości atrybut2. Czyli w Twoim przypadku w jednej tabeli SysWiadomosc przyjmuje 'XXX' to w innej tabeli SysEmail też musi przyjmować 'XXX' i w tej drugiej tabeli czyli SysEmail masz jakieś dane uzupełniające dla wartości atrybutu z tabeli SysWiadomość. Patrząc na Twoje nazwy tabel ciężko się domyśleć co chcesz osiągnąc i czy to jest dobre rozwiązanie. Może masz źle zaprojektowaną bazę danych?

W tablicy Zadanie w kolumnie SysWiadomosc, będą identyfikatory wszystkich typów zadań. Oczywiście ta kolumna nie jest unikalna.

Może utwórz nową tablicę Identyfikatory, w której będziesz miał id_identyfikatora oraz inne atrybuty odpowiadające tym identyfikatorom, bo jeżeli masz w tablicy Zadanie atrybut SysWiadomosc, w której jest identyfikator typów zadań i potem w tej samej tabeli masz jakieś inne atrybuty odnoszące się do tego identyfikatora to mamy do czynienia z nadmiarowością danych.

Wklej proszę strukturę Twoich tabel oraz opisz za co są odpowiedzialne poszczególne atrbuty, a będziemy mogli Ci pomóc dokładniej.

Pozdrowienia z Konina.

0

Podaj definicję SmsMessage (z informacją które pole(-a) jest PK) oraz definicję tabeli Task.
Napisz między którymi kolumnami chcesz stworzyć klucz obcy. Swoją drogą klucz obcy powinien wskazywać na klucz główny w drugiej tabeli, jesteś pewien że u ciebie tak jest. Oraz że kolumny są tego samego typu?

0

user image

Chcę połączyć jeszcze table SMS i Fax do tabeli Task.

0

now77ak: jeszcze struktury tabel wklej.

0

Powiązań między tabelami nie kopiowałem

CREATE TABLE [dbo].[EmailMessage](
	[SysEmailMessage] [int] IDENTITY(1,1) NOT NULL,
	[SysEmailServer] [int] NOT NULL,
	[SysSendTo] [int] NULL,
	[SysCc] [int] NULL,
	[SysBcc] [int] NULL,
	[Topic] [varchar](2000) NULL,
	[Body] [text] NULL,
	[IsBodyHtml] [bit] NULL,
 CONSTRAINT [PK_EmailMessage] PRIMARY KEY CLUSTERED 
(
	[SysEmailMessage] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]


CREATE TABLE [dbo].[FaxMessage](
	[SysFaxMessage] [int] IDENTITY(1,1) NOT NULL,
	[SysSendTo] [int] NULL,
	[FaxFile] [varbinary](max) NULL,
 CONSTRAINT [PK_FaxMessage] PRIMARY KEY CLUSTERED 
(
	[SysFaxMessage] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]



CREATE TABLE [dbo].[SmsMessage](
	[SysSmsMessage] [int] IDENTITY(1,1) NOT NULL,
	[SysSendTo] [int] NULL,
	[Body] [varchar](2048) NULL,
 CONSTRAINT [PK_SmsMessage] PRIMARY KEY CLUSTERED 
(
	[SysSmsMessage] 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].[Task](
	[SysTask] [int] IDENTITY(1,1) NOT NULL,
	[SysTaskType] [int] NOT NULL,
	[SysTaskStatus] [int] NOT NULL,
	[SysSchedule] [int] NULL,
	[SysError] [int] NULL,
	[SysMessage] [int] NULL,
	[CreationDate] [datetime] NOT NULL,
	[ExecutionDate] [datetime] NULL,
	[TaskOwner] [varchar](255) NOT NULL,
	[Priority] [int] NULL,
	[Comments] [varchar](1024) NULL,
 CONSTRAINT [PK_Task] PRIMARY KEY CLUSTERED 
(
	[SysTask] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

 
0

Zapytam inaczej,

W jaki sposób zaprojektować bazę danych w ten sposób, aby zrealizować takie połączenia?
Tzn mam tablicę Zadanie. Zadaniem może być wysłanie różnego typu wiadomości, każdy typ zapisany jest w osobnej tablicy. Dlatego w tablicy Zadanie jest kolumną "SysWiadomosc" oraz kolumna "Typ". Kolumna "SysWiadomosc" ma wskazywać na identyfikator z odpowiedniej tabeli (Email, Sms, GG, Fax itp itd), zależnej od kolumny "Typ".

1 użytkowników online, w tym zalogowanych: 0, gości: 1