โครงสร้างฐานข้อมูลสินค้าคงคลังเมื่อรายการสินค้าคงคลังมีแอตทริบิวต์ที่แตกต่างกัน


10

ฉันกำลังสร้างฐานข้อมูลสินค้าคงคลังเพื่อจัดเก็บข้อมูลฮาร์ดแวร์ขององค์กร อุปกรณ์ที่ฐานข้อมูลติดตามนั้นมีตั้งแต่เวิร์กสเตชันแล็ปท็อปสวิตช์เราเตอร์โทรศัพท์มือถือ ฯลฯ ฉันใช้หมายเลขซีเรียลของอุปกรณ์เป็นคีย์หลัก ปัญหาที่ฉันมีคือคุณสมบัติอื่น ๆ ของอุปกรณ์เหล่านี้แตกต่างกันไปและฉันไม่ต้องการให้มีฟิลด์ในตารางสินค้าคงคลังที่ไม่เกี่ยวข้องกับอุปกรณ์อื่น ด้านล่างคือลิงค์ไปยัง ERD ของส่วนหนึ่งของฐานข้อมูล (ความสัมพันธ์ FK บางอย่างไม่แสดง) ฉันกำลังพยายามตั้งค่าตัวอย่างเช่นอุปกรณ์ที่มีประเภทอุปกรณ์เวิร์กสเตชันไม่สามารถใส่ลงในตารางโทรศัพท์ ดูเหมือนว่าจะต้องมีการใช้ทริกเกอร์จำนวนมากเพื่อตรวจสอบประเภทอุปกรณ์หรือคลาสและตารางใหม่ทุกครั้งที่มีการติดตามอุปกรณ์ที่แตกต่างกันที่มีคุณลักษณะแตกต่างกัน

ERD1

ฉันค้นหาการตั้งค่าตารางคุณลักษณะที่สามารถแมปกับหมายเลขซีเรียลได้ แต่จะอนุญาตให้แอททริบิวที่ไม่ใช้กับประเภทอุปกรณ์ที่จะกำหนดให้กับอุปกรณ์เช่นใครบางคนสามารถกำหนดแอตทริบิวต์หมายเลขโทรศัพท์ให้กับเวิร์กสเตชันได้หากต้องการ . ฉันพบคำอธิบายเกี่ยวกับเว็บไซต์นี้ที่ให้โครงสร้างดังต่อไปนี้:

Widget ตัวอย่าง ERD

โครงสร้างนี้จะใช้งานได้ดีหากคุณลักษณะทั้งหมดนั้นใช้ได้กับรายการที่ฉันจัดเก็บ ตัวอย่างเช่นหากฐานข้อมูลจัดเก็บเฉพาะโทรศัพท์มือถือแอตทริบิวต์อาจเป็นสิ่งต่าง ๆ เช่นหน้าจอสัมผัสแทร็คแพดคีย์บอร์ด 4G และ 3G ... อะไรก็ได้ ในกรณีนั้นพวกเขาทั้งหมดใช้กับโทรศัพท์ ฐานข้อมูลของฉันจะมีคุณลักษณะเช่นชื่อโฮสต์, circuitType, phoneNumber ซึ่งใช้กับอุปกรณ์ประเภทเฉพาะเท่านั้น

ฉันต้องการตั้งค่าเพื่อให้สามารถกำหนดแอททริบิวที่ใช้กับประเภทอุปกรณ์ที่กำหนดให้กับอุปกรณ์ประเภทนั้นเท่านั้น คำแนะนำใด ๆ เกี่ยวกับวิธีการตั้งค่าฐานข้อมูลนี้? ฉันไม่แน่ใจว่านี่เป็นการใช้ความสัมพันธ์แบบหนึ่งต่อหนึ่งหรือไม่หรือถ้ามีวิธีที่ดีกว่าในการทำเช่นนี้ ขอบคุณล่วงหน้าที่สละเวลาในการตรวจสอบเรื่องนี้

นี่คือกระทู้อื่น ๆ ที่ฉันอ่าน พวกเขาให้ข้อมูลเชิงลึกที่ดีแก่ฉัน แต่ฉันไม่คิดว่าพวกเขาจะนำไปใช้จริง:

/programming/9335548/how-to-structure-database-for-inventory-of-unlike-items

/programming/1249632/database-structure-for-items-with-varying-attributes

/programming/5559587/product-inventory-with-multiple-attributes

/programming/6613802/question-about-setting-up-inventory-database

/programming/514111/how-to-best-represent-items-with-variable-of-attributes-in-a-database

คำตอบ:


6

supertype / ย่อย

วิธีการเกี่ยวกับรูปแบบ supertype / subtype? คอลัมน์ทั่วไปจะอยู่ในตารางหลัก แต่ละประเภทที่แตกต่างมีตารางของตัวเองที่มี ID ของผู้ปกครองเป็นของตัวเองของมันและมันมีคอลัมน์ที่ไม่ซ้ำกันไม่ได้ทั่วไปในทุกประเภทย่อย คุณสามารถรวมคอลัมน์ประเภทในทั้งตารางหลักและตารางรองเพื่อให้แน่ใจว่าแต่ละอุปกรณ์ไม่สามารถมีมากกว่าหนึ่งประเภทย่อย ทำ FK ระหว่างลูกกับพาเรนต์บน (ItemID, ItemTypeID) คุณสามารถใช้ FK เพื่อตาราง supertype หรือ subtype เพื่อรักษาความสมบูรณ์ที่ต้องการในที่อื่น ตัวอย่างเช่นถ้าอนุญาต ItemID ประเภทใด ๆ ให้สร้าง FK ลงในตารางหลัก ถ้าสามารถอ้างอิง SubItemType1 เท่านั้นให้สร้าง FK ลงในตารางนั้น ฉันจะปล่อย TypeID ออกจากตารางอ้างอิง

การตั้งชื่อ

เมื่อพูดถึงการตั้งชื่อคุณมีสองทางเลือกตามที่ฉันเห็น (เนื่องจากตัวเลือกที่สามของ "ID" อยู่ในใจของฉันคือรูปแบบการต่อต้านที่แข็งแกร่ง) เรียกใช้คีย์ย่อย ItemID เหมือนกับที่อยู่ในตารางพาเรนต์หรือเรียกว่าชื่อย่อยเช่น DoohickeyID หลังจากความคิดและประสบการณ์บางอย่างเกี่ยวกับเรื่องนี้ฉันแนะนำให้เรียกมันว่า DoohickeyID สาเหตุของเรื่องนี้คือแม้ว่าจะมีความสับสนเกี่ยวกับตารางย่อยในการปลอมแปลงรายการที่มีรายการ (มากกว่า Doohickeys) ซึ่งเป็นค่าลบเล็กน้อยเมื่อเทียบกับเมื่อคุณสร้าง FK ไปยังตาราง Doohickey และชื่อคอลัมน์ไม่ การจับคู่!

เพื่อ EAV หรือไม่ต่อ EAV - ประสบการณ์ของฉันกับฐานข้อมูล EAV

ถ้า EAV เป็นสิ่งที่คุณต้องทำอย่างแท้จริงนั่นคือสิ่งที่คุณต้องทำ แต่ถ้ามันไม่ใช่สิ่งที่คุณต้องทำล่ะ

ฉันสร้างฐานข้อมูล EAV ที่ใช้งานในธุรกิจ ขอบคุณพระเจ้าชุดข้อมูลมีขนาดเล็ก (แม้ว่าจะมีหลายประเภทรายการ) ดังนั้นประสิทธิภาพจึงไม่เลว แต่มันจะไม่ดีถ้าฐานข้อมูลมีมากกว่าสองสามพันรายการในนั้น! นอกจากนี้ตารางยังยากที่จะสอบถาม ประสบการณ์นี้ทำให้ฉันปรารถนาที่จะหลีกเลี่ยงฐานข้อมูล EAV ในอนาคตหากเป็นไปได้

ตอนนี้ในฐานข้อมูลของฉันฉันสร้างขั้นตอนการจัดเก็บที่สร้างมุมมอง PIVOTed โดยอัตโนมัติสำหรับแต่ละประเภทย่อยที่มีอยู่ ฉันสามารถสอบถามได้จาก AutoDoohickey ข้อมูลเมตาของฉันเกี่ยวกับชนิดย่อยมีคอลัมน์ "ชื่อย่อ" ที่มีชื่อที่ปลอดภัยสำหรับวัตถุที่เหมาะสำหรับใช้ในชื่อมุมมอง ฉันได้ปรับปรุงมุมมอง! น่าเสียดายที่คุณไม่สามารถอัปเดตพวกเขาเมื่อเข้าร่วม แต่คุณสามารถแทรกแถวที่มีอยู่แล้วให้พวกเขาซึ่งจะถูกแปลงเป็น UPDATE น่าเสียดายที่คุณไม่สามารถอัปเดตคอลัมน์เพียงไม่กี่คอลัมน์เนื่องจากไม่มีวิธีที่จะระบุถึงคอลัมน์ที่คุณต้องการอัปเดตด้วยกระบวนการแปลง INSERT-to-UPDATE: ค่า NULL ดูเหมือนว่า "อัปเดตคอลัมน์นี้เป็น NULL" แม้ว่า คุณต้องการระบุว่า "อย่าอัปเดตคอลัมน์นี้เลย"

แม้จะมีการตกแต่งทั้งหมดนี้เพื่อให้ฐานข้อมูล EAV ใช้งานได้ง่ายขึ้น แต่ฉันก็ยังไม่ได้ใช้มุมมองเหล่านี้ในการสืบค้นตามปกติเพราะมันช้า เงื่อนไขการสืบค้นไม่ได้ถูกผลักออกไปตลอดทางValueดังนั้นจึงต้องสร้างชุดผลลัพธ์ระดับกลางของรายการทั้งหมดของประเภทมุมมองนั้นก่อนทำการกรอง อุ๊ยตาย ดังนั้นฉันมีหลายแบบสอบถามจำนวนมากที่มีจำนวนมากเข้าร่วมจำนวนมากแต่ละคนออกไปเพื่อให้ได้ค่าที่แตกต่างและอื่น ๆ พวกเขาทำงานได้ค่อนข้างดี แต่อุ๊ย! นี่คือตัวอย่าง SP ที่สร้างสิ่งนี้ (และทริกเกอร์การอัปเดต) เป็นสัตว์ร้ายตัวหนึ่งและฉันภูมิใจในมัน แต่มันไม่ใช่สิ่งที่คุณต้องการจะลองทำ

CREATE VIEW [dbo].[AutoModule]
AS
--This view is automatically generated by the stored procedure AutoViewCreate
SELECT
   ElementID,
   ElementTypeID,
   Convert(nvarchar(160), [3]) [FullName],
   Convert(nvarchar(1024), [435]) [Descr],
   Convert(nvarchar(255), [439]) [Comment],
   Convert(bit, [438]) [MissionCritical],
   Convert(int, [464]) [SupportGroup],
   Convert(int, [461]) [SupportHours],
   Convert(nvarchar(40), [4]) [Ver],
   Convert(bit, [28744]) [UsesJava],
   Convert(nvarchar(256), [28745]) [JavaVersions],
   Convert(bit, [28746]) [UsesIE],
   Convert(nvarchar(256), [28747]) [IEVersions],
   Convert(bit, [28748]) [UsesAcrobat],
   Convert(nvarchar(256), [28749]) [AcrobatVersions],
   Convert(bit, [28794]) [UsesDotNet],
   Convert(nvarchar(256), [28795]) [DotNetVersions],
   Convert(bit, [512]) [WebApplication],
   Convert(nvarchar(10), [433]) [IFAbbrev],
   Convert(int, [437]) [DataID],
   Convert(nvarchar(1000), [463]) [Notes],
   Convert(nvarchar(512), [523]) [DataDescription],
   Convert(nvarchar(256), [27991]) [SpecialNote],
   Convert(bit, [28932]) [Inactive],
   Convert(int, [29992]) [PatchTestedBy]
FROM (
   SELECT
      E.ElementID + 0 ElementID,
      E.ElementTypeID,
      V.AttrID,
      V.Value
   FROM
      dbo.Element E
      LEFT JOIN dbo.Value V ON E.ElementID = V.ElementID
   WHERE
      EXISTS (
         SELECT *
         FROM dbo.LayoutUsage L
         WHERE
            E.ElementTypeID = L.ElementTypeID
            AND L.AttrLayoutID = 7
      )
) X
PIVOT (
   Max(Value)
   FOR AttrID IN ([3], [435], [439], [438], [464], [461], [4], [28744], [28745], [28746], [28747], [28748], [28749], [28794], [28795], [512], [433], [437], [463], [523], [27991], [28932], [29992])
) P;

ต่อไปนี้เป็นมุมมองที่สร้างขึ้นโดยอัตโนมัติอีกประเภทที่สร้างขึ้นโดยกระบวนงานที่เก็บไว้อื่นจากข้อมูลเมตาพิเศษเพื่อช่วยค้นหาความสัมพันธ์ระหว่างรายการที่สามารถมีหลายเส้นทางระหว่างกัน (โดยเฉพาะ: โมดูล -> เซิร์ฟเวอร์, โมดูล -> คลัสเตอร์ -> เซิร์ฟเวอร์โมดูล -> DBMS- > เซิร์ฟเวอร์, โมดูล -> DBMS-> Cluster-> เซิร์ฟเวอร์):

CREATE VIEW [dbo].[Link_Module_Server]
AS
-- This view is automatically generated by the stored procedure LinkViewCreate
SELECT
   ModuleID = A.ElementID,
   ServerID = B.ElementID
FROM
   Element A
   INNER JOIN Element B
      ON EXISTS (
         SELECT *
         FROM
            dbo.Element R1
         WHERE
            A.ElementID = R1.ElementID1
            AND B.ElementID = R1.ElementID2
            AND R1.ElementTypeID = 38
      ) OR EXISTS (
         SELECT *
         FROM
            dbo.Element R1
            INNER JOIN dbo.Element R2 ON R1.ElementID2 = R2.ElementID1
         WHERE
            A.ElementID = R1.ElementID1
            AND R1.ElementTypeID = 40
            AND B.ElementID = R2.ElementID2
            AND R2.ElementTypeID = 38
      ) OR EXISTS (
         SELECT *
         FROM
            dbo.Element R1
            INNER JOIN dbo.Element R2 ON R1.ElementID2 = R2.ElementID1
         WHERE
            A.ElementID = R1.ElementID1
            AND R1.ElementTypeID = 38
            AND B.ElementID = R2.ElementID2
            AND R2.ElementTypeID = 3122
      ) OR EXISTS (
         SELECT *
         FROM
            dbo.Element R1
            INNER JOIN dbo.Element R2 ON R1.ElementID2 = R2.ElementID1
            INNER JOIN dbo.Element C2 ON R2.ElementID2 = C2.ElementID
            INNER JOIN dbo.Element R3 ON R2.ElementID2 = R3.ElementID1
         WHERE
            A.ElementID = R1.ElementID1
            AND R1.ElementTypeID = 40
            AND C2.ElementTypeID = 3080
            AND R2.ElementTypeID = 38
            AND B.ElementID = R3.ElementID2
            AND R3.ElementTypeID = 3122
      )
WHERE
   A.ElementTypeID = 9
   AND B.ElementTypeID = 17

แนวทางไฮบริด

หากคุณต้องมีแง่มุมแบบไดนามิกของฐานข้อมูล EAV บางส่วนคุณสามารถพิจารณาสร้างข้อมูลเมตาได้ราวกับว่าคุณมีฐานข้อมูลดังกล่าว แต่จริงๆแล้วใช้รูปแบบการออกแบบ supertype / subtype แทน ใช่คุณจะต้องสร้างตารางใหม่และเพิ่มและลบและแก้ไขคอลัมน์ แต่ด้วยการประมวลผลล่วงหน้าที่เหมาะสม (อย่างที่ฉันทำกับมุมมองอัตโนมัติของฐานข้อมูล EAV ของฉัน) คุณอาจมีวัตถุคล้ายโต๊ะจริง ๆ ใช้งานได้ มีเพียงพวกเขาจะไม่เป็น gnarly เหมือนของฉันและเครื่องมือเพิ่มประสิทธิภาพการค้นหาสามารถทำนายการกดลงไปที่ตารางฐาน (อ่าน: ทำงานได้ดีกับพวกเขา) จะมีเพียงหนึ่งการรวมกันระหว่างตาราง supertype และตารางย่อย แอปพลิเคชันของคุณสามารถตั้งค่าให้อ่านข้อมูลเมตาเพื่อค้นหาสิ่งที่ควรทำ (หรือสามารถใช้มุมมองที่สร้างขึ้นอัตโนมัติในบางกรณี)

หรือหากคุณมีชุดย่อยหลายระดับให้เข้าร่วมเพียงไม่กี่ครั้ง โดยหลายระดับฉันหมายถึงเมื่อบางชนิดย่อยใช้คอลัมน์ร่วมกัน แต่ไม่ใช่ทั้งหมดคุณอาจมีตารางย่อยสำหรับประเภทที่เป็น supertype ของตารางอื่นสองสามตัว ตัวอย่างเช่นหากคุณจัดเก็บข้อมูลเกี่ยวกับเซิร์ฟเวอร์เราเตอร์และเครื่องพิมพ์ประเภทย่อยขั้นกลางของ "อุปกรณ์ IP" อาจสมเหตุสมผล

ฉันจะให้ข้อแม้ที่ฉันยังไม่ได้สร้างฐานข้อมูลที่ตกแต่งด้วย EAV แบบ metatable ที่มีรูปแบบ supertype / subtype แบบ EAV อย่างที่ฉันแนะนำที่นี่และยังลองในโลกแห่งความจริง แต่ปัญหาที่ฉันเคยประสบกับ EAV นั้นไม่ใช่เรื่องเล็กและการทำบางสิ่งบางอย่างอาจเป็นสิ่งที่จำเป็นอย่างยิ่งหากฐานข้อมูลของคุณจะใหญ่และคุณต้องการประสิทธิภาพที่ดีโดยไม่ต้องใช้ฮาร์ดแวร์ขนาดยักษ์ราคาแพง

ในความเห็นของฉันเวลาที่ใช้โดยอัตโนมัติการใช้ / การสร้าง / การดัดแปลงของตารางย่อยจริงจะดีที่สุด การมุ่งเน้นไปที่ความยืดหยุ่นที่ได้จากข้อมูลทำให้เสียง EAV นั้นน่าสนใจ (และเชื่อฉันฉันชอบว่าเมื่อมีคนถามฉันถึงคุณลักษณะใหม่ในประเภทองค์ประกอบที่ฉันสามารถเพิ่มได้ในเวลาประมาณ 18 วินาทีและพวกเขาสามารถเริ่มป้อนข้อมูลในเว็บไซต์ได้ทันที ) แต่ความยืดหยุ่นสามารถทำได้มากกว่าหนึ่งวิธี! การประมวลผลล่วงหน้าเป็นอีกวิธีในการดำเนินการ มันเป็นวิธีการที่ทรงพลังซึ่งมีผู้ใช้น้อยคนที่ให้ประโยชน์ในการขับเคลื่อนข้อมูลโดยสิ้นเชิง แต่ประสิทธิภาพของการเขียนโค้ดยาก

(หมายเหตุ: ใช่มุมมองเหล่านั้นถูกจัดรูปแบบเช่นนั้นและมุมมอง PIVOT มีตัวกระตุ้นการอัปเดตจริง ๆ :) หากมีคนสนใจรายละเอียดอันเจ็บปวดของตัวเรียก UPDATE ที่ยาวและซับซ้อนแจ้งให้เราทราบและฉันจะโพสต์ ตัวอย่างสำหรับคุณ)

และอีกหนึ่งความคิด

ใส่ข้อมูลทั้งหมดของคุณไว้ในตารางเดียว ตั้งชื่อคอลัมน์ทั่วไปจากนั้นนำมาใช้ซ้ำ / ไม่เหมาะสมเพื่อวัตถุประสงค์หลายอย่าง สร้างมุมมองเหล่านี้เพื่อให้ชื่อที่สมเหตุสมผล เพิ่มคอลัมน์เมื่อคอลัมน์ที่ไม่ได้ใช้ชนิดข้อมูลที่เหมาะสมไม่พร้อมใช้งานและอัปเดตมุมมองของคุณ แม้ความยาวของฉันจะเกิดขึ้นกับชนิดย่อย / supertype แต่นี่อาจเป็นวิธีที่ดีที่สุด


ฉันคิดถึงการออกแบบนี้โดยที่แต่ละตารางย่อยมี PK จากพาเรนต์และฟิลด์ที่ผิดปกติ ฉันคิดว่าฉันสามารถใส่เขตข้อมูลชนิดในแม่และตารางย่อยแต่ละประเภทแล้วใส่ข้อ จำกัด การตรวจสอบกับพวกเขา ฉันตัดสินใจที่จะหลีกเลี่ยงการออกแบบนี้เพราะมันจะต้องมีตารางใหม่เมื่อใดก็ตามที่ต้องมีการติดตามอุปกรณ์ชนิดใหม่และความสัมพันธ์แบบหนึ่งต่อหนึ่ง ดูเหมือนว่ายุ่งและไม่ยืดหยุ่น ฉันขอขอบคุณที่คุณป้อนข้อมูล
TheSecretSquad

ฉันสร้างฐานข้อมูล EAV ที่ใช้งานในธุรกิจ ขอบคุณพระเจ้าชุดข้อมูลมีขนาดเล็ก (แม้ว่าจะมีหลายประเภทรายการ) ดังนั้นประสิทธิภาพจึงไม่เลว แต่มันจะเป็นถ้าฐานข้อมูลมีมากกว่าสองสามพันรายการในนั้น ประสบการณ์นี้ทำให้ฉันมีความปรารถนาที่จะหลีกเลี่ยงฐานข้อมูล EAV ในอนาคตหากเป็นไปได้เพราะพวกเขายากที่จะสืบค้น
ErikE

นอกจากนี้เวลาที่ฉันใช้โดยอัตโนมัติการใช้ / การสร้าง / การปรับเปลี่ยนตารางย่อยจริงจะทำให้ดีที่สุด
ErikE

หลังจากตรวจสอบรูปแบบ EAV ฉันก็รู้ว่าค่าสำหรับแอตทริบิวต์นั้นถูกบังคับให้แบ่งปันประเภทข้อมูล (สตริงทั้งหมดในกรณีนี้) นอกจากนี้การสอบถามการตั้งค่า EAV จะเป็นงานที่น่าเบื่อ Supertype / subtype ดูดีกว่า คำถามของฉันตอนนี้คือตารางบางประเภทอนุญาตเฉพาะอุปกรณ์บางประเภทเท่านั้น ฉันจะตรวจสอบสิ่งนี้ด้วยการใส่รหัสคลาสอุปกรณ์ (โทรศัพท์คอมพิวเตอร์เราเตอร์) ในทุกตารางและวางข้อ จำกัด การตรวจสอบในฟิลด์นั้นหรือฉันจะแยกฟิลด์นั้นออกจากตารางย่อยและใช้ทริกเกอร์แต่ละรายการหรือไม่ โปรดดูERD3สำหรับการอ้างอิง
TheSecretSquad

1
สำหรับการสืบค้นข้อมูล EAV ไม่ใช่เรื่องแปลกที่จะสร้างดาต้ามาร์ตของตารางเชิงสัมพันธ์สำหรับข้อมูลที่คุณต้องการสืบค้นจากนั้นเติมข้อมูลโดยใช้สคริปต์บางอย่าง แบบสอบถามจะทำงานได้เร็วขึ้น แต่เทียบกับข้อมูลที่คุณใส่ใน datamart เท่านั้นและการตั้งค่าต้องใช้การวางแผนที่ค่อนข้างยุติธรรม
FrustratedWithFormsDesigner

6

ในกรณีของคุณแนวทางที่ดีที่สุดคือรูปแบบที่หลากหลายในรูปแบบของเอนทิตี - แอตทริบิวต์ - ค่า (EAV) มีผู้คนมากมายที่หนีไปจาก EAV เพราะมันไม่ช่วยเหลือในบางด้านและใช้เวลาไปในทางที่ผิด อย่างไรก็ตาม EAV เป็นโซลูชันที่ทำงานได้ดีสำหรับความต้องการเฉพาะของคุณ

รูปแบบที่คุณต้องการรวมสำหรับสถานการณ์ของคุณคือการสรุปคุณลักษณะหนึ่งระดับห่างจากเอนทิตีของคุณ (เช่นรายการสินค้าคงคลังของคุณ) เป็นหลักคุณต้องการกำหนดประเภทอุปกรณ์ที่มีรายการของคุณลักษณะ จากนั้นคุณจะกำหนดอินสแตนซ์ของอุปกรณ์ที่มีค่าสำหรับแต่ละแอททริบิวซึ่งอุปกรณ์ประเภทนั้นควรจะมี

นี่คือภาพร่างของ ERD:

ERD

DEVICE_ATTRIBUTEมีค่าสำหรับแอตทริบิวต์ทั่วไปแต่ละประเภท DEVICE_TYPEกำหนดรายการของคุณลักษณะทั่วไปที่ใช้กับประเภทที่กำหนดของอุปกรณ์ TYPICAL_DEVICE_ATTRIBUTEs(เหล่านี้เป็น

สิ่งนี้ช่วยให้คุณควบคุมได้ว่าต้องกรอกแอตทริบิวต์ใดสำหรับอุปกรณ์ในขณะที่การให้อุปกรณ์ประเภทต่าง ๆ มีรายการคุณลักษณะที่แตกต่างกัน นอกจากนี้ยังช่วยให้คุณเปรียบเทียบอุปกรณ์ต่าง ๆ ได้ง่ายขึ้นโดยเชื่อมคุณสมบัติของอุปกรณ์เข้ากับอุปกรณ์อื่น


ดูเหมือนว่าสิ่งที่ ssmusoke แนะนำ ฉันเปลี่ยน ERD ของฉันโดยใช้คำแนะนำของเขาและดูเหมือนว่าจะตรงกับคุณ รู้สึกอิสระที่จะตรวจสอบ RD ใหม่ที่http://www.dividegraphics.com/ERD2.jpgและให้ข้อเสนอแนะใด ๆ
TheSecretSquad

@reallythecrash - คุณถูกต้องฉันแนะนำวิธีการขั้นพื้นฐานเช่นเดียวกับ ssmusoke ฉันเพิ่งใช้แทคที่แตกต่างกันในคำตอบของฉันด้วยความหวังว่าจะทำให้เข้าใจทั้งโครงสร้างของแบบจำลองและเหตุผลในการใช้ EAV ซึ่งเป็น ผู้คนจำนวนมาก (ไม่ยุติธรรม) บอกว่าเป็นรูปแบบการต่อต้าน
Joel Brown

หลังจากการวิจัยบางอย่างฉันเห็นว่าทำไมผู้คนถึงคิดว่า EAV เป็นรูปแบบการต่อต้าน ฉันคิดว่ามันง่ายในการจัดเก็บข้อมูลโดยใช้ EAV แต่มีความซับซ้อนโดยเฉพาะอย่างยิ่งสำหรับการสืบค้นและการบำรุงรักษาประเภทข้อมูล ฉันคิดว่ามันเป็นรูปแบบที่มีจุดประสงค์ที่แคบและควรใช้โดยนักพัฒนาที่มีประสบการณ์ซึ่งสามารถใช้งานได้อย่างถูกต้องนั่นคือไม่ใช่ฉัน ฉันอาจจะเลือกกระบวนทัศน์แบบ supertype / subtype
TheSecretSquad

@JoelBrown - ซอฟต์แวร์ใดที่คุณใช้ในการร่างแผนภาพดังกล่าว?
Vidar

@Vidar - ฉันใช้ Visio กับรูปแบบ ERD ที่ฉันสร้างขึ้นเพื่อใช้ระเบียบการมองเห็นของ James Martin และวาดด้วยรูปแบบเส้นที่กำหนดเองที่เป็นภาพร่าง ฉันพบว่านี่เป็นเครื่องมือที่ดีสำหรับการใช้แบบจำลองข้อมูลด่วน / ร่าง เมื่อไดอะแกรมเป็นทางการเกินไปมันอาจทำให้บางคนคิดว่ามันเสร็จแล้วดังนั้นบางสิ่งบางอย่างที่สมบูรณ์แบบจะช่วยป้องกันไม่ให้ผู้คนกระโดดไปสู่ข้อสรุปเกี่ยวกับวิธีการสร้างแบบจำลองข้อมูลให้แน่น
Joel Brown

1
  1. แนวทางโดยรวมมีดังนี้:

a) แบบจำลอง Entity-Attribute-Value เพื่อจัดการกับคุณลักษณะของอุปกรณ์ต่าง ๆ กับประเภทอุปกรณ์ อุปกรณ์แต่ละประเภทจะมีรายการแอตทริบิวต์ที่มีค่าที่คุณติดตาม

b) สำหรับอุปกรณ์แต่ละประเภทคุณติดตามรายละเอียดสินค้าคงคลังตามหมายเลขซีเรียลซึ่งสอดคล้องกับอุปกรณ์เดียว

  1. ดังนั้นคุณจะจบลงด้วยตารางต่อไปนี้:

a) คุณสมบัติ - กำหนดคุณสมบัติสำหรับอุปกรณ์ทั้งหมด (อะไรก็ตามที่อยู่ในตารางนี้) คอลัมน์: id, ชื่อ, คำอธิบาย

b) Item Attributes - กำหนดคุณสมบัติที่อนุญาตสำหรับอุปกรณ์เฉพาะ - itemid, attributeid

c) นิยามรายการ - กำหนดรายการว่า Black Berry Torch 4500, Iphone 4S, Iphone 3S ฯลฯ - id, ชื่อ, คำอธิบาย, รหัสประเภท (ถ้าคุณต้องการเพิ่มหมวดหมู่เช่นโทรศัพท์มือถือ, สวิตช์ ฯลฯ )

d) อุปกรณ์ - อุปกรณ์แต่ละรายการ - id, itemid, สินค้าคงคลังวันที่, ปิดการใช้งาน, หมายเลขซีเรียล ... (โดยทั่วไปคุณลักษณะอื่น ๆ ทั้งหมดสำหรับอุปกรณ์)

หากคุณต้องการติดตามข้อมูลอื่น ๆ เกี่ยวกับการแปลงอุปกรณ์จากนั้นคุณสามารถเพิ่มตารางเพิ่มเติมที่เชื่อมโยงกับอุปกรณ์ตามที่คุณต้องการ


ขอบคุณสำหรับข้อมูลของคุณ สิ่งนี้สอดคล้องกับสิ่งที่ฉันกำลังมองหาฉันไม่สามารถเข้าใจได้ว่าจะทำอย่างไร ฉันเปลี่ยน ERD ของฉันเพื่อสะท้อนถึงรายละเอียดของคุณ ดูเหมือนว่าจะต้องใช้งานมากกว่านี้เพื่อป้อนแอททริบิวต์ที่อนุญาตสำหรับอุปกรณ์แต่ละประเภท แต่ดูเหมือนว่ามันจะให้ความยืดหยุ่นสูงสุด ฉันจะสร้างต้นแบบเล็ก ๆ เพื่อดูว่ามันใช้งานได้ตามที่ฉันคิดหรือไม่ ขอบคุณอีกครั้ง. ฉันอัปโหลด ERD พร้อมการเปลี่ยนแปลงหากคุณต้องการตรวจสอบและแจ้งให้ฉันทราบว่าฉันอยู่ในเส้นทางที่ถูกต้องหรือไม่ http://www.dividegraphics.com/ERD2.jpg
TheSecretSquad

ใช่คุณอยู่ในเส้นทางที่ถูกต้อง
Stephen Senkomago Musoke

EAV จะให้ความยืดหยุ่นมากมาย แต่คุณยังมีเมทาดาทาอีกมากที่ห้อยอยู่รอบ ๆ เพื่อให้มันทำงานได้
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner ดูเหมือนจะหลีกเลี่ยงไม่ได้เมื่อระบบจัดเก็บรายการโทรศัพท์สวิทช์พีซีแล็ปท็อป ฯลฯ ... ข้อมูลเมตาที่ดีกว่าตารางอื่น ๆ ที่ฉันจะบอก
Stephen Senkomago Musoke

1
@ssmusoke: เห็นด้วย แต่ฉันต้องการที่จะเน้นจุดนั้นเพราะฉันเคยเห็นคนล้มเหลวในการตระหนักถึงความสำคัญของข้อมูลเมตาแล้วการใช้ EAV ของพวกเขากลายเป็นฝันร้าย
FrustratedWithFormsDesigner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.