Keresés

Új hozzászólás Aktív témák

  • nyunyu

    félisten

    válasz Pürrhosz #5643 üzenetére

    1:1-nél mindegy, melyik oldalon van a külső kulcs, működhet az, amit eredetileg elképzeltél.

    (Még mindig nem értem az adatmodelledet, ez valami adatpiac akar lenni csillag sémával, ahol A a hub, B, C meg a különböző dimenziói? Akkor eleve A-ba kellett volna tenni a B_index és C_index oszlopokat.)

    Akkor:

    A-ba B_index felvétele:
    ALTER TABLE A ADD COLUMN B_index INTEGER FOREIGN KEY REFERENCES B(B_index);

    A.B_index mező feltöltése
    MERGE INTO A
    USING B
    ON (A.A_index = B.A_index)
    WHEN MATCHED THEN
    UPDATE SET A.B_index = B.B_index;

    Ha nem 1:1 volt eredetileg a kapcsolat, akkor hibaüzenettel el fog szállni!

    B-ből a felesleges A_index kidobása:
    ALTER TABLE B DROP COLUMN A_index;

  • nyunyu

    félisten

    válasz Pürrhosz #5641 üzenetére

    Eléggé félremehetett a DB tervezése, ha mindenhol 1 : N reláció lett implementálva. (1 A objektumhoz tartozhat N féle B tulajdonság, ekkor kerül az A_index oszlop a B táblába.)

    Igen, ha az A-C viszonyt/kapcsolatot/relációt is N : M-re akarod átalakítani, akkor oda is kell egy új kapcsolótábla, értelemszerűen A_index és C_index oszlopokkal.

  • nyunyu

    félisten

    válasz Pürrhosz #5639 üzenetére

    Ha jól értem, akkor neked inkább egy új, AB tábla (a_index, b_index) kéne, az kapcsolná össze az A táblában leírt objektumokat, és a B táblában leírt tulajdonságaikat.
    Így tetszőleges N:M kapcsolatot le tudnál írni: egy A-hoz több B tulajdonság is tartozhatna (pl. alma lehet piros, zöld és sárga is), és B tulajdonság tartozhatna több A objektumhoz is. (alma és citrom is sárga).

    Kapcsoló tábla létrehozása A-ra, B-re mutató külső kulcsokkal:
    CREATE TABLE AB (
    A_index INTEGER FOREIGN KEY REFERENCES A(A_index),
    B_index INTEGER FOREIGN KEY REFERENCES B(B_index)
    );

    Törölni az AB táblából bármikor tudsz, viszont a külső kulcsok miatt sem az A-ból, sem a B-ből nem fogsz tudni olyan értéket törölni, amire az AB hivatkozik!

    Feltöltése a meglévő B táblából:
    INSERT INTO AB (A_index, B_index)
    SELECT A_index, B_index
    FROM B;

    (B táblában ezután már felesleges az A_index mező, el lehet dobni:
    ALTER TABLE B DROP COLUMN A_index;
    Helyette mindig az AB táblát kell majd joinolni.)

    Új kombó, pl. zöld alma beszúrása (ha már külön-külön létezik az alma és a zöld is):
    INSERT INTO AB (A_index, B_index)
    SELECT A.A_index, B.B_index
    FROM A
    JOIN B
    ON 1=1
    WHERE A.A_name = 'Alma'
    AND B.B_name = 'Zöld';

    Milyen színű répa van?
    SELECT B.B_name
    FROM A
    JOIN AB
    ON AB.A_index = A.A_index
    JOIN B
    ON B.B_index = AB.B_index
    WHERE A.A_name = 'Répa';

    Melyik gyümölcs sárga?
    SELECT A.A_name
    FROM B
    JOIN AB
    ON AB.B_index = B.B_index
    JOIN A
    ON A.A_index = AB.A_index
    WHERE B.B_name = 'Sárga';

Új hozzászólás Aktív témák