एक इकाई प्रकार को कैसे मॉडल करें जिसमें विशेषताओं के विभिन्न सेट हो सकते हैं?


11

मुझे उपयोगकर्ताओं और आइटम के बीच एक-से-कई (1: M) संबंध के साथ डेटाबेस को पुनः बनाने में कुछ परेशानी हो रही है ।

यह बहुत सीधा है, हाँ; हालाँकि, प्रत्येक आइटम एक निश्चित श्रेणी (जैसे, एक कार , एक नाव या विमान ) से संबंधित है, और प्रत्येक श्रेणी में विशेषताओं की एक विशेष संख्या है, जैसे:

Car संरचना:

+----+--------------+--------------+
| PK | Attribute #1 | Attribute #2 |
+----+--------------+--------------+

Boat संरचना:

+----+--------------+--------------+--------------+
| PK | Attribute #1 | Attribute #2 | Attribute #3 |
+----+--------------+--------------+--------------+

Plane संरचना:

+----+--------------+--------------+--------------+--------------+
| PK | Attribute #1 | Attribute #2 | Attribute #3 | Attribute #4 |
+----+--------------+--------------+--------------+--------------+

विशेषताओं (कॉलम) की संख्या में इस विविधता के कारण, मैंने शुरू में सोचा था कि प्रत्येक श्रेणी के लिए एक अलग तालिका बनाना एक अच्छा विचार होगा, इसलिए मैं कई NULL से बचूंगा और इस प्रकार अनुक्रमण का बेहतर उपयोग करूंगा

हालाँकि यह पहली बार में बहुत अच्छा लग रहा था, लेकिन मुझे डेटाबेस के माध्यम से आइटम और श्रेणियाँ के बीच संबंध बनाने का कोई तरीका नहीं मिला क्योंकि, डेटाबेस प्रशासक के रूप में कम से कम मेरे मामूली अनुभव में, विदेशी कुंजी बनाते समय, मैं स्पष्ट रूप से एक डेटाबेस को सूचित करता हूं तालिका का नाम और स्तंभ।

अंत में, मैं सभी डेटा को संग्रहीत करने के लिए एक ठोस संरचना चाहूंगा, जबकि एक उपयोगकर्ता के पास एक क्वेरी के साथ सभी आइटमों की सभी विशेषताओं को सूचीबद्ध करने के लिए सभी साधन होंगे ।

मैं सर्वर-साइड भाषा के साथ गतिशील प्रश्नों को हार्डकोड कर सकता था , लेकिन मुझे लगता है कि यह गलत है और बहुत इष्टतम नहीं है।

अतिरिक्त जानकारी

ये MDCCL टिप्पणियों के लिए मेरी प्रतिक्रियाएँ हैं:

1. आपके व्यावसायिक संदर्भ, तीन (यानी, कार , नाव और विमान ) या अधिक में कितने आइटम श्रेणियां हैं ?

वास्तव में, यह बहुत सरल है: कुल पाँच श्रेणियाँ हैं

2. क्या एक ही आइटम हमेशा एक ही उपयोगकर्ता से संबंधित होगा (अर्थात, एक बार दिए गए आइटम को एक निश्चित उपयोगकर्ता को "असाइन" कर दिया गया है जिसे इसे बदला नहीं जा सकता है)?

नहीं, वे बदल सकते थे। प्रश्न के काल्पनिक परिदृश्य में, यह उपयोगकर्ता बी के लिए आइटम # 1 बेचता है , इसलिए स्वामित्व को प्रतिबिंबित होना चाहिए।

3. क्या ऐसी विशेषताएँ हैं जो कुछ या सभी श्रेणियों द्वारा साझा की जाती हैं ?

साझा नहीं किया गया है, लेकिन स्मृति से, मैं बता सकता हूं कि सभी श्रेणियों में कम से कम तीन विशेषताएँ मौजूद हैं ।

4. क्या एक मौका है कि उपयोगकर्ता और आइटम के बीच के रिश्ते की कार्डिनलिटी एक-से-कई (1: एम) के बजाय कई-से-कई (एम: एन) है? उदाहरण के लिए, निम्नलिखित व्यावसायिक नियमों के मामले में: A User owns zero-one-or-many ItemsऔरAn Item is owned by one-to-many Users

नहीं, क्योंकि आइटम एक भौतिक वस्तु का वर्णन करेंगे। उपयोगकर्ताओं के पास उनकी एक आभासी प्रति होगी, प्रत्येक को एक अद्वितीय GUID v4 द्वारा पहचाना जाएगा

5. एक प्रश्न टिप्पणी के लिए अपनी निम्नलिखित प्रतिक्रिया के बारे में:

"प्रश्न के काल्पनिक परिदृश्य में, यह उपयोगकर्ता ए की तरह होगा जो उपयोगकर्ता बी के लिए आइटम # 1 बेचता है , इसलिए स्वामित्व को प्रतिबिंबित किया जाना चाहिए।"

ऐसा लगता है कि आप आइटम के स्वामित्व के विकास पर नज़र रखने की योजना बना रहे हैं , इसलिए बोलने के लिए। इस तरह, आप इस तरह की घटना के बारे में कौन सी विशेषताएँ संग्रहीत करना चाहेंगे? केवल उस विशेषता का संशोधन जो विशिष्ट उपयोगकर्ता को इंगित करता है जो किसी विशिष्ट आइटम का स्वामी है ?

नहीं वास्तव में नहीं। स्वामित्व बदल सकते हैं, लेकिन मैं पिछले का ट्रैक रखने की जरूरत नहीं है मालिक

जवाबों:


18

विचाराधीन कारोबारी माहौल के आपके विवरण के अनुसार, एक सुपर- टाइप -सबटाइप संरचना मौजूद है जो आइटम को सम्मिलित करती है - सुपर- टाइप - और इसके प्रत्येक श्रेणियाँ , कार , नाव और विमान (दो और के साथ जो ज्ञात नहीं थे) - उपप्रकारों-।

मैं इस तरह के परिदृश्य का प्रबंधन करने के लिए निम्नलिखित विधि का विस्तार करूंगा।

व्यापार नियम

प्रासंगिक वैचारिक स्कीमा का परिसीमन शुरू करने के लिए , अब तक निर्धारित किए गए कुछ सबसे महत्वपूर्ण व्यावसायिक नियम ( केवल तीन श्रेणियों के लिए विश्लेषण को प्रतिबंधित करना , चीजों को यथासंभव संक्षिप्त रखना) निम्नानुसार तैयार किए जा सकते हैं:

  • एक उपयोगकर्ता शून्य-एक-या-कई आइटम का मालिक है
  • एक आइटम एक विशिष्ट त्वरित पर ठीक एक उपयोगकर्ता के स्वामित्व में है
  • एक आइटम समय-समय पर अलग - अलग बिंदुओं पर एक से कई उपयोगकर्ताओं के स्वामित्व में हो सकता है
  • एक आइटम को ठीक एक श्रेणी में वर्गीकृत किया गया है
  • एक आइटम हर समय है,
    • या तो एक कार
    • या एक नाव
    • या एक विमान

चित्रण IDEF1X आरेख

चित्र 1 IDEF1X 1 आरेख प्रदर्शित करता है जिसे मैंने पिछले योगों के साथ-साथ अन्य व्यावसायिक नियमों के समूह के लिए बनाया था जो कि प्रासंगिक हैं:

चित्र 1 - आइटम और श्रेणियाँ सुपर-टाइप-सबटाइप संरचना

महाप्रकार

एक ओर, मद , महाप्रकार, उपहार गुण या विशेषताओं है कि करने के लिए सभी आम हैं श्रेणियाँ , यानी,

  • CategoryCode- एक विदेशी कुंजी (FK) के रूप में निर्दिष्ट किया गया है, जो श्रेणी.CategoryCode और उप-प्रकार भेदभाव के रूप में कार्य करता है , अर्थात, यह उप-प्रकार की सटीक श्रेणी को इंगित करता है जिसके साथ किसी दिए गए आइटम को कनेक्ट किया जाना चाहिए-,
  • OwnerId- एक FK के रूप में प्रतिष्ठित है जो User.UserId को इंगित करता है , लेकिन मैंने इसे एक भूमिका नाम 2 दिया है ताकि इसके विशेष निहितार्थों को और अधिक सटीक रूप से दर्शाया जा सके-
  • फू ,
  • बार ,
  • बाज और
  • बनाया गया डेटाइम

उप प्रकार

दूसरी ओर, गुण per जो प्रत्येक विशेष श्रेणी से संबंधित हैं , अर्थात

  • Qux और Corge ;
  • अंगूर , गरारे और प्लुग ;
  • Xyzzy , गिरना , Wibble और Flob ;

इसी उपप्रकार बॉक्स में दिखाए जाते हैं।

पहचानकर्ता

फिर, Item.ItemId प्राथमिक कुंजी (PK) ने अलग-अलग भूमिका नामों के साथ उपप्रकारों के लिए 3 माइग्रेट किया है , अर्थात

  • CarId ,
  • नाव और
  • PlaneId

पारस्परिक रूप से अनन्य संघों

जैसा कि दर्शाया गया है, प्रत्येक सुपरर्टाइप घटना और (बी) इसके पूरक उपप्रकार उदाहरण के बीच एक-से-एक (1: 1) कार्डिनैलिटी का संबंध या संबंध है ।

विशेष उप-प्रकार प्रतीक तथ्य यह है कि उप-प्रकारों परस्पर अनन्य हैं, यानी चित्रण है, एक ठोस मद घटना केवल एक ही उप-प्रकार उदाहरण के पूरक जा सकता है: या तो एक कार , या एक विमान , या एक नाव (दो या अधिक से कभी नहीं)।

Employed , place मैंने कुछ प्रकार की एंटिटी प्रॉपर्टीज़ को राइट करने के लिए क्लासिक प्लेसहोल्डर नामों को नियोजित किया, क्योंकि प्रश्न में उनकी वास्तविक संप्रदायों की आपूर्ति नहीं की गई थी।

एक्सपोजिटरी तार्किक-स्तरीय लेआउट

नतीजतन, एक एक्सपोज़रिटरी लॉजिकल डिज़ाइन पर चर्चा करने के लिए, मैंने निम्नलिखित एसईएफ-डीडीएल बयानों को आईडीईएफ 1 एक्स आरेख के आधार पर प्रदर्शित किया है और ऊपर वर्णित है:

-- You should determine which are the most fitting 
-- data types and sizes for all your table columns 
-- depending on your business context characteristics.

-- Also, you should make accurate tests to define the 
-- most convenient INDEX strategies based on the exact 
-- data manipulation tendencies of your business context.

-- As one would expect, you are free to utilize 
-- your preferred (or required) naming conventions. 

CREATE TABLE UserProfile (
    UserId          INT      NOT NULL,
    FirstName       CHAR(30) NOT NULL,
    LastName        CHAR(30) NOT NULL,
    BirthDate       DATE     NOT NULL,
    GenderCode      CHAR(3)  NOT NULL,
    Username        CHAR(20) NOT NULL,
    CreatedDateTime DATETIME NOT NULL,
    --
    CONSTRAINT UserProfile_PK  PRIMARY KEY (UserId),
    CONSTRAINT UserProfile_AK1 UNIQUE ( -- Composite ALTERNATE KEY.
        FirstName,
        LastName,
        GenderCode,
        BirthDate
    ),
    CONSTRAINT UserProfile_AK2 UNIQUE (Username) -- ALTERNATE KEY.
);

CREATE TABLE Category (
    CategoryCode     CHAR(1)  NOT NULL, -- Meant to contain meaningful, short and stable values, e.g.; 'C' for 'Car'; 'B' for 'Boat'; 'P' for 'Plane'.
    Name             CHAR(30) NOT NULL,
    --
    CONSTRAINT Category_PK PRIMARY KEY (CategoryCode),
    CONSTRAINT Category_AK UNIQUE      (Name) -- ALTERNATE KEY.
);

CREATE TABLE Item ( -- Stands for the supertype.
    ItemId           INT      NOT NULL,
    OwnerId          INT      NOT NULL,
    CategoryCode     CHAR(1)  NOT NULL, -- Denotes the subtype discriminator.
    Foo              CHAR(30) NOT NULL,
    Bar              CHAR(30) NOT NULL,
    Baz              CHAR(30) NOT NULL,  
    CreatedDateTime  DATETIME NOT NULL,
    --
    CONSTRAINT Item_PK             PRIMARY KEY (ItemId),
    CONSTRAINT Item_to_Category_FK FOREIGN KEY (CategoryCode)
        REFERENCES Category    (CategoryCode),
    CONSTRAINT Item_to_User_FK     FOREIGN KEY (OwnerId)
        REFERENCES UserProfile (UserId)  
);

CREATE TABLE Car ( -- Represents one of the subtypes.
    CarId INT      NOT NULL, -- Must be constrained as (a) the PRIMARY KEY and (b) a FOREIGN KEY.
    Qux   CHAR(30) NOT NULL,
    Corge CHAR(30) NOT NULL,   
    --
    CONSTRAINT Car_PK         PRIMARY KEY (CarId),
    CONSTRAINT Car_to_Item_FK FOREIGN KEY (CarId)
        REFERENCES Item (ItemId)  
);

CREATE TABLE Boat ( -- Stands for one of the subtypes.
    BoatId INT      NOT NULL, -- Must be constrained as (a) the PRIMARY KEY and (b) a FOREIGN KEY.
    Grault CHAR(30) NOT NULL,
    Garply CHAR(30) NOT NULL,   
    Plugh  CHAR(30) NOT NULL, 
    --
    CONSTRAINT Boat_PK         PRIMARY KEY (BoatId),
    CONSTRAINT Boat_to_Item_FK FOREIGN KEY (BoatId)
        REFERENCES Item (ItemId)  
);

CREATE TABLE Plane ( -- Denotes one of the subtypes.
    PlaneId INT      NOT NULL, -- Must be constrained as (a) the PRIMARY KEY and (b) a FOREIGN KEY.
    Xyzzy   CHAR(30) NOT NULL,
    Thud    CHAR(30) NOT NULL,  
    Wibble  CHAR(30) NOT NULL,
    Flob    CHAR(30) NOT NULL,  
    --
    CONSTRAINT Plane_PK         PRIMARY KEY (PlaneId),
    CONSTRAINT Plane_to_Item_PK FOREIGN KEY (PlaneId)
        REFERENCES Item (ItemId)  
);

जैसा कि प्रदर्शित किया गया है, सुपर बेसिटी प्रकार और उप-प्रकार के प्रत्येक को संबंधित बेस टेबल द्वारा दर्शाया गया है ।

स्तंभ CarId, BoatIdऔर PlaneId, उपयुक्त तालिकाओं के PKs के रूप में विवश, FK के माध्यम से वैचारिक स्तर के एक-से-एक संघ का प्रतिनिधित्व करने में मदद करते हैं §ItemId स्तंभ की ओर इशारा करते हैं , जो Itemतालिका के PK के रूप में विवश है । यह दर्शाता है कि, एक वास्तविक "जोड़ी" में, सुपरपेप और उपप्रकार दोनों पंक्तियों को एक ही पीके मान द्वारा पहचाना जाता है; इस प्रकार, यह उल्लेख करने के लिए अवसर से अधिक है

  • (क) एक संलग्न अतिरिक्त पकड़ प्रणाली नियंत्रित सरोगेट मूल्यों के लिए स्तंभ (ख) टेबल उपप्रकार के लिए खड़े करने के लिए (ग) है पूरी तरह से ज़रूरत से ज़्यादा

§ आदेश समस्याओं और त्रुटियों के विषय में (विशेष रूप से विदेशी) प्रमुख बाधा परिभाषाओं -situation आप टिप्पणियां- में निर्दिष्ट रोकने के लिए, यह बहुत महत्वपूर्ण है को ध्यान में रखना है अस्तित्व-निर्भरता कि हाथ में अलग-अलग तालिकाओं के बीच जगह लेता है, के रूप में में एक उदाहरण प्रस्तुत किया एक्सप्लोजिट डीडीएल संरचना में तालिकाओं की घोषणा के आदेश, जो मैंने इस एसक्यूएल फिडेल में भी आपूर्ति की थी ।

जैसे, MySQL पर निर्मित डेटाबेस की एक तालिका में AUTO_INCREMENT संपत्ति के साथ एक अतिरिक्त कॉलम को जोड़ना ।

अखंडता और स्थिरता विचार

यह इंगित करना महत्वपूर्ण है कि, आपके व्यावसायिक वातावरण में, आपको (1) यह सुनिश्चित करना होगा कि प्रत्येक "सुपरपाइप" पंक्ति हर समय अपने संबंधित "उपप्रकार" समकक्ष द्वारा पूरक हो, और, बदले में (2) गारंटी जो कहे "सुपरस्क्रिप्ट" पंक्ति के "विभेदक" कॉलम में निहित मूल्य के साथ "सबटाइप" पंक्ति संगत है।

ऐसी परिस्थितियों को घोषणात्मक तरीके से लागू करना बहुत ही सुरुचिपूर्ण होगा लेकिन, दुर्भाग्य से, प्रमुख SQL प्लेटफार्मों में से किसी ने भी ऐसा करने के लिए उचित तंत्र प्रदान नहीं किया है, जहाँ तक मुझे पता है। इसलिए, ACID लेन-देन के भीतर प्रक्रियात्मक कोड का सहारा लेना काफी सुविधाजनक है, ताकि ये परिस्थितियाँ आपके डेटाबेस में हमेशा मिलें। अन्य विकल्प TRIGGERS को नियोजित करेंगे, लेकिन वे चीजों को बेकार कर देते हैं, इसलिए बोलने के लिए।

उपयोगी विचारों की घोषणा

ऊपर बताए गए की तरह एक तार्किक डिजाइन होने के नाते, यह एक या एक से अधिक दृश्य बनाने के लिए बहुत व्यावहारिक होगा, अर्थात, व्युत्पन्न टेबल जिसमें स्तंभ शामिल होते हैं जो संबंधित बेस टेबल के दो या अधिक से अधिक होते हैं । इस तरह, आप कर सकते हैं, उदाहरण के लिए, सीधे उन विचारों से सीधे चुनें, जब आप हर बार "संयुक्त" जानकारी प्राप्त करने के लिए सभी जोइनों को लिखने के बिना।

नमूना डेटा

इस संबंध में, हम कहते हैं कि आधार तालिका नीचे दिखाए गए नमूना डेटा के साथ "पॉपुलेटेड" हैं:

--

INSERT INTO UserProfile 
    (UserId, FirstName, LastName, BirthDate, GenderCode, Username, CreatedDateTime)
VALUES
    (1, 'Edgar', 'Codd', '1923-08-19', 'M', 'ted.codd', CURDATE()),
    (2, 'Michelangelo', 'Buonarroti', '1475-03-06', 'M', 'michelangelo', CURDATE()),
    (3, 'Diego', 'Velázquez', '1599-06-06', 'M', 'd.velazquez', CURDATE());

INSERT INTO Category 
    (CategoryCode, Name)
VALUES
    ('C', 'Car'), ('B', 'Boat'), ('P', 'Plane');

-- 1. ‘Full’ Car INSERTion

-- 1.1 
INSERT INTO Item
    (ItemId, OwnerId, CategoryCode, Foo, Bar, Baz, CreatedDateTime)
VALUES
    (1, 1, 'C', 'This datum', 'That datum', 'Other datum', CURDATE());

 -- 1.2
INSERT INTO Car
    (CarId, Qux, Corge)
VALUES
    (1, 'Fantastic Car', 'Powerful engine pre-update!');

-- 2. ‘Full’ Boat INSERTion

-- 2.1
INSERT INTO Item
  (ItemId, OwnerId, CategoryCode, Foo, Bar, Baz, CreatedDateTime)
VALUES
  (2, 2, 'B', 'This datum', 'That datum', 'Other datum', CURDATE());

-- 2.2
INSERT INTO Boat
    (BoatId, Grault, Garply, Plugh)
VALUES
    (2, 'Excellent boat', 'Use it to sail', 'Everyday!');

-- 3 ‘Full’ Plane INSERTion

-- 3.1
INSERT INTO Item
  (ItemId, OwnerId, CategoryCode, Foo, Bar, Baz, CreatedDateTime)
VALUES
  (3, 3, 'P', 'This datum', 'That datum', 'Other datum', CURDATE());

-- 3.2
INSERT INTO Plane
    (PlaneId, Xyzzy, Thud, Wibble, Flob)
VALUES
    (3, 'Extraordinary plane', 'Traverses the sky', 'Free', 'Like a bird!');

--

फिर, एक लाभप्रद दृश्य वह है जो स्तंभों को इकट्ठा करता है Item, Carऔर UserProfile:

--

CREATE VIEW CarAndOwner AS
    SELECT C.CarId,
           I.Foo,
           I.Bar,
           I.Baz,
           C.Qux,
           C.Corge,           
           U.FirstName AS OwnerFirstName,
           U.LastName  AS OwnerLastName
        FROM Item I
        JOIN Car C
          ON C.CarId = I.ItemId
        JOIN UserProfile U
          ON U.UserId = I.OwnerId;

--

स्वाभाविक रूप से, एक समान दृष्टिकोण का पालन किया जा सकता है ताकि आप "पूर्ण" का चयन कर सकें Boatऔर एक ही तालिका (एक व्युत्पन्न एक, इन मामलों में) Planeसे सीधे जानकारी प्राप्त कर सकें ।

कि आप -यदि निम्नलिखित दृश्य परिभाषा के साथ परिणाम sets- में शून्य के निशान की उपस्थिति के बारे में कोई आपत्ति नहीं है के बाद, आप कर सकते हैं, जैसे, "इकट्ठा" टेबल से कॉलम Item, Car, Boat, Planeऔर UserProfile:

--

CREATE VIEW FullItemAndOwner AS
    SELECT I.ItemId,
           I.Foo, -- Common to all Categories.
           I.Bar, -- Common to all Categories.
           I.Baz, -- Common to all Categories.
          IC.Name      AS Category,
           C.Qux,    -- Applies to Cars only.
           C.Corge,  -- Applies to Cars only.
           --
           B.Grault, -- Applies to Boats only.
           B.Garply, -- Applies to Boats only.
           B.Plugh,  -- Applies to Boats only.
           --
           P.Xyzzy,  -- Applies to Planes only.
           P.Thud,   -- Applies to Planes only.
           P.Wibble, -- Applies to Planes only.
           P.Flob,   -- Applies to Planes only.
           U.FirstName AS OwnerFirstName,
           U.LastName  AS OwnerLastName
        FROM Item I
        JOIN Category IC
          ON I.CategoryCode = IC.CategoryCode
   LEFT JOIN Car C
          ON C.CarId = I.ItemId
   LEFT JOIN Boat B
          ON B.BoatId = I.ItemId
   LEFT JOIN Plane P
          ON P.PlaneId = I.ItemId               
        JOIN UserProfile U
          ON U.UserId = I.OwnerId;

--

यहां दिखाए गए विचारों का कोड केवल उदाहरण है। बेशक, कुछ परीक्षण अभ्यास और संशोधन करने से प्रश्नों पर (भौतिक) निष्पादन में तेजी लाने में मदद मिल सकती है। इसके अलावा, आपको उक्त विचारों को हटाने या कॉलम जोड़ने की आवश्यकता हो सकती है क्योंकि व्यवसाय को निर्देश की आवश्यकता होती है।

नमूना डेटा और सभी दृश्य परिभाषाओं को इस एसक्यूएल फिडेल में शामिल किया गया है ताकि उन्हें "एक्शन" में देखा जा सके।

डेटा हेरफेर: एप्लिकेशन प्रोग्राम (ओं) कोड और स्तंभ उपनाम

एप्लिकेशन प्रोग्राम (एस) कोड का उपयोग (यदि आप "सर्वर-साइड विशिष्ट कोड" से क्या मतलब है) और स्तंभ उपनाम अन्य महत्वपूर्ण बिंदु हैं जो आप अगली टिप्पणियों में लाए हैं:

  • मैंने सर्वर-साइड विशिष्ट कोड के साथ [एक जॉइन] समस्या को हल करने का प्रबंधन किया, लेकिन मैं वास्तव में ऐसा नहीं करना चाहता हूं -और- सभी कॉलमों में उपनाम जोड़ना "तनावपूर्ण" हो सकता है।

  • बहुत अच्छी तरह से समझाया, बहुत-बहुत धन्यवाद। हालाँकि, जैसा कि मुझे संदेह था, मुझे कुछ कॉलम के समान होने के कारण सभी डेटा को सूचीबद्ध करते समय परिणाम सेट में हेरफेर करना होगा, क्योंकि मैं बयान को साफ रखने के लिए कई उपनामों का उपयोग नहीं करना चाहता।

यह इंगित करने के लिए उपयुक्त है कि एप्लिकेशन प्रोग्राम कोड का उपयोग करते समय परिणाम सेट की प्रस्तुति (या चित्रमय) सुविधाओं को संभालने के लिए एक बहुत ही उपयुक्त संसाधन है, निष्पादन गति के मुद्दों को रोकने के लिए पंक्ति-दर-पंक्ति आधार पर डेटा पुनर्प्राप्ति से बचना सर्वोपरि है। इसका उद्देश्य SQL मंच के (ठीक) सेट इंजन द्वारा प्रदान किए गए मजबूत डेटा हेरफेर साधनों के माध्यम से टोटको में उचित डेटा सेट को "लाना" होना चाहिए ताकि आप अपने सिस्टम के व्यवहार को अनुकूलित कर सकें।

इसके अलावा, एक निश्चित दायरे में एक या एक से अधिक स्तंभों का नाम बदलने के लिए उपनामों का उपयोग करना तनावपूर्ण हो सकता है, लेकिन व्यक्तिगत रूप से, मैं ऐसे संसाधन को एक बहुत शक्तिशाली उपकरण के रूप में देखता हूं जो (i) को प्रासंगिक बनाने में मदद करता है और (ii) संबंधित को बताए गए अर्थ और इरादे को अस्वीकार करता है। कॉलम; इसलिए, यह एक पहलू है जिसे ब्याज के डेटा के हेरफेर के संबंध में पूरी तरह से विचार किया जाना चाहिए।

इसी तरह के परिदृश्य

साथ ही आप मदद की मिल सकती है पदों की इस श्रृंखला और पदों के इस समूह के जो दो अन्य मामलों है कि पारस्परिक रूप से विशिष्ट उपप्रकार साथ महाप्रकार-उप प्रकार संघों में शामिल हैं पर मेरी ले होते हैं।

मैंने एक व्यावसायिक वातावरण के लिए एक समाधान का प्रस्ताव भी किया है जिसमें एक सुपर-टाइप-उपप्रकार क्लस्टर शामिल है जहाँ उपप्रकार इस (नए) उत्तर में परस्पर अनन्य नहीं हैं ।


एंडनोट्स

1 सूचना मॉडलिंग के लिए एकीकरण परिभाषा ( IDEF1X ) एक अत्यधिक अनुशंसित डेटा मॉडलिंग तकनीक है जिसेदिसंबर 1993 में यूएस नेशनल इंस्टीट्यूट ऑफ स्टैंडर्ड एंड टेक्नोलॉजी (NIST)द्वारा मानक के रूप में स्थापित किया गया था। यह मजबूत पर (क) सैद्धांतिक कार्यों में से कुछ ने लिखी आधारित है एकमात्र प्रवर्तक की संबंधपरक मॉडल , यानी, डॉ एफई कॉड ; डॉ। पीपी चेन द्वारा विकसित(बी) इकाई-संबंध दृश्य ; और (ग) रॉबर्ट जी ब्राउन द्वारा निर्मित लॉजिकल डाटाबेस डिजाइन तकनीक पर भी।

2 आईडीईएफ 1 एक्स में, एक भूमिका नाम एक विशिष्ट लेबल है जिसे एफके संपत्ति (या विशेषता) को सौंपा गया है ताकि अर्थ यह व्यक्त किया जा सके कि यह अपने संबंधित इकाई प्रकार के दायरे में है।

3 IDEF1X मानक प्रमुख प्रवासन को "एक बच्चे के रूप में अपने बच्चे या श्रेणी की इकाई में एक मूल या जेनेरिक इकाई की प्राथमिक कुंजी रखने की मॉडलिंग प्रक्रिया" एक विदेशी कुंजी के रूप मेंपरिभाषित करता है।


1
मुझे यकीन नहीं है कि मैं आपकी जांच को समझता हूं, लेकिन जैसा कि DDL लेआउट में चित्रित किया गया है, Itemतालिका में एक CategoryCodeकॉलम शामिल है । जैसा कि "अखंडता और स्थिरता विचार" शीर्षक वाले खंड में वर्णित है:
एमडीसीसीएल

1
यह इंगित करना महत्वपूर्ण है कि, आपके व्यावसायिक वातावरण में, आपको (1) यह सुनिश्चित करना होगा कि प्रत्येक "सुपरपाइप" पंक्ति हर समय अपने संबंधित "उपप्रकार" समकक्ष द्वारा पूरक हो, और, बदले में (2) गारंटी जो कहे "सुपरस्क्रिप्ट" पंक्ति के "विभेदक" कॉलम में निहित मूल्य के साथ "सबटाइप" पंक्ति संगत है।
एमडीसीसीएल

1
ऐसी परिस्थितियों को घोषणात्मक तरीके से लागू करना बहुत ही सुरुचिपूर्ण होगा लेकिन, दुर्भाग्य से, प्रमुख SQL प्लेटफार्मों में से किसी ने भी ऐसा करने के लिए उचित तंत्र प्रदान नहीं किया है, जहाँ तक मुझे पता है। इसलिए, ACID लेन-देन के भीतर प्रक्रियात्मक कोड का सहारा लेना काफी सुविधाजनक है, ताकि ये परिस्थितियाँ आपके डेटाबेस में हमेशा मिलें। अन्य विकल्प TRIGGERS को नियोजित करेंगे, लेकिन वे चीजों को बेकार कर देते हैं, इसलिए बोलने के लिए।
एमडीसीसीएल

1
इस मामले की जड़ यह है कि कोई SQL कार्यान्वयन (MySQL बोली सहित) ASSERTIONS, शक्तिशाली और सुरुचिपूर्ण घोषणात्मक उपकरणों के लिए उचित समर्थन प्रदान करता है जो प्रक्रियात्मक दृष्टिकोण (लेनदेन या ट्रिगर्स) का सहारा लेने से बचने में मदद करेगा, या एक अनावश्यक तरीके से घेरने जैसा काम करेगा। , जैसे, CategoryColumnसारणी के लिए खड़े तालिकाओं में अनावश्यक रूप से दोहराते हुए (तार्किक पर सभी निहितार्थ के साथ [जैसे, संशोधन विसंगतियों] और अमूर्त के भौतिक स्तर [जैसे, अतिरिक्त अनुक्रमित, बड़ी संरचनाएं, आदि]]।
एमडीसीसीएल

2
जब तक डेटाबेस प्रबंधन प्रणाली विक्रेताओं / डेवलपर्स में से कोई भी इस कार्य के लिए ASSERTIONS की आपूर्ति करता है — मैं इस प्रक्रिया (ट्रायल) या ओवर-बी (कार्रवाई के निरर्थक पाठ्यक्रम) को पसंद करता हूं, हालांकि (ख) एक संभावना है- जो मैं व्यक्तिगत रूप से सिफारिश नहीं करता हूं- बेशक, डीबीए को प्रासंगिक डेटा डेटाबेस में प्रासंगिक डेटा हेरफेर संचालन से संबंधित अनुमतियों का सावधानीपूर्वक प्रबंधन करना है, जो डेटा अखंडता को बनाए रखने में निश्चित रूप से काफी मदद करता है।
एमडीसीसीएल

0

आओ हम मुख्य तालिका उत्पाद कहते हैं। यह साझा योगदान को होस्ट करता है। तो फिर हम कहते हैं कि हमारे पास एक कार टेबल, एक प्लेन टेबल और एक बोट टेबल है। इन तीन तालिकाओं में उत्पाद तालिका की ID पंक्ति पर FK बाधा के साथ ProductID कुंजी होगी। यदि आप उन सभी को चाहते हैं - उनके साथ जुड़ें। अगर आप सिर्फ कार चाहते हैं, तो लेफ्ट कार से जुड़कर प्रोडक्ट्स (या राइट ज्वाइन प्रोडक्ट और कार, लेकिन मैं हमेशा लेफ्ट साइडेड जॉइन का इस्तेमाल करना पसंद करता हूं)।

इसे एक हाइपरसोनिक डेटा मॉडल कहा जाता है। उप-तालिकाओं की कम संख्या के लिए यह एक लंबी तालिका (उत्पादों के मील) में समझ में आ सकती है।


और फिर मैं उपयोगकर्ताओं को उत्पादों के साथ शामिल करूं?
user5613506

1
आमतौर पर आपको उपयोगकर्ता जानकारी की आवश्यकता नहीं होती है जब आप उत्पादों की एक सूची अपने सामने के छोर पर लौट रहे होते हैं, तो आपको उत्पाद जानकारी की आवश्यकता होती है। उपयोगकर्ताओं और उत्पादों में शामिल होने और प्रत्येक लौटे उत्पाद पंक्ति के लिए समान उपयोगकर्ता जानकारी वापस करने का कोई मतलब नहीं है। इसलिए पहले आप उत्पाद तालिका द्वारा उत्पादों की तालिका और उपयुक्त उप-तालिका (कार, नाव ...) को जोड़कर फ़िल्टर करें और फिर आप उपयोगकर्ता द्वारा WHERE खंड का उपयोग करके फ़िल्टर करें। आम तौर पर आप उत्पाद तालिका (उपयोगकर्ता तालिका के आईडी स्तंभ पर एक एफके) में एक मालिक होना चाहते हैं। तो आप एक WHERE Owner = [Request.User] जोड़ेंगे।
23
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.