Cấu trúc cơ sở dữ liệu hàng tồn kho khi các mặt hàng tồn kho có thuộc tính khác nhau


10

Tôi đang xây dựng một cơ sở dữ liệu hàng tồn kho để lưu trữ thông tin phần cứng doanh nghiệp. Các thiết bị cơ sở dữ liệu theo dõi phạm vi từ máy trạm, máy tính xách tay, thiết bị chuyển mạch, bộ định tuyến, điện thoại di động, v.v. Tôi đang sử dụng số sê-ri thiết bị làm khóa chính. Vấn đề tôi gặp phải là các thuộc tính khác cho các thiết bị này khác nhau và tôi không muốn có các trường trong bảng kiểm kê không liên quan đến các thiết bị khác. Dưới đây là một liên kết đến ERD của một phần của cơ sở dữ liệu (một số quan hệ FK không được hiển thị). Tôi đang cố gắng thiết lập nó, ví dụ, vì vậy một thiết bị có loại thiết bị máy trạm không thể được đặt vào bảng điện thoại. Điều này dường như yêu cầu sử dụng rất nhiều trình kích hoạt để xác thực loại hoặc loại thiết bị và các bảng mới bất cứ lúc nào một thiết bị khác với các thuộc tính khác nhau sẽ được theo dõi;

ERD1

Tôi đã xem xét việc thiết lập các bảng thuộc tính có thể được ánh xạ thành số sê-ri, nhưng điều đó sẽ cho phép các thuộc tính không áp dụng cho loại thiết bị được gán cho thiết bị, ví dụ: ai đó có thể gán thuộc tính số điện thoại cho máy trạm nếu họ muốn . Tôi tìm thấy một lời giải thích trên trang web này có cấu trúc như sau:

Widget mẫu ERD

Cấu trúc này sẽ hoạt động rất tốt nếu tất cả các thuộc tính có thể áp dụng cho các mục tôi đang lưu trữ. Ví dụ: nếu cơ sở dữ liệu chỉ lưu trữ điện thoại di động, các thuộc tính có thể là những thứ như màn hình cảm ứng, bàn di chuột, bàn phím, 4G, 3G ... bất cứ thứ gì. Trong trường hợp đó, tất cả đều áp dụng cho điện thoại. Cơ sở dữ liệu của tôi sẽ có các thuộc tính như tên máy chủ, CircuitType, phoneNumber, chỉ áp dụng cho các loại thiết bị cụ thể.

Tôi muốn thiết lập nó để chỉ các thuộc tính áp dụng cho một loại thiết bị nhất định có thể được gán cho một thiết bị loại đó. Bất kỳ đề xuất về cách thiết lập cơ sở dữ liệu này? Tôi không chắc liệu đây có phải là cách sử dụng hợp lý các mối quan hệ một-một hay không, hoặc nếu có cách nào tốt hơn để làm điều này. Cảm ơn bạn trước vì đã dành thời gian để xem xét điều này.

Dưới đây là một số chủ đề khác tôi đọc. Họ đã cho tôi một cái nhìn sâu sắc, nhưng tôi không nghĩ rằng họ thực sự áp dụng:

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

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

/programming/5559587/product-inventory-with-multipl-attribut

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

/programming/514111/how-to-best-putesent-items-with-variable-of-attribut-in-a-database

Câu trả lời:


6

Siêu kiểu / Subtype

Làm thế nào về việc nhìn vào mô hình supertype / subtype? Các cột phổ biến đi trong một bảng cha. Mỗi loại riêng biệt có bảng riêng với ID của cha mẹ là PK riêng và nó chứa các cột duy nhất không phổ biến cho tất cả các kiểu con. Bạn có thể bao gồm một cột loại trong cả bảng cha và con để đảm bảo mỗi thiết bị không thể có nhiều hơn một kiểu con. Tạo một FK giữa trẻ em và cha mẹ trên (ItemID, ItemTypeID). Bạn có thể sử dụng FK cho các bảng siêu kiểu hoặc bảng phụ để duy trì tính toàn vẹn mong muốn ở nơi khác. Ví dụ: nếu ItemID của bất kỳ loại nào được cho phép, hãy tạo FK cho bảng cha. Nếu chỉ có thể tham chiếu SubItemType1, hãy tạo FK cho bảng đó. Tôi sẽ loại TypeID ra khỏi các bảng tham chiếu.

Đặt tên

Khi nói đến việc đặt tên, bạn có hai lựa chọn như tôi thấy (vì lựa chọn thứ ba chỉ là "ID" trong suy nghĩ của tôi là một kiểu chống đối mạnh mẽ). Hoặc gọi khóa phụ là ItemID giống như trong bảng cha hoặc gọi nó là tên kiểu con như DoohickeyID. Sau một số suy nghĩ và một số kinh nghiệm với điều này, tôi ủng hộ việc gọi nó là DoohickeyID. Lý do cho điều này là mặc dù có thể có sự nhầm lẫn về bảng phụ thực sự ngụy trang có chứa Vật phẩm (chứ không phải là Doohickeys), đó là một tiêu cực nhỏ so với khi bạn tạo FK cho bảng Doohickey và tên cột không trận đấu!

Đến EAV hay không EAV - Trải nghiệm của tôi với cơ sở dữ liệu EAV

Nếu EAV là những gì bạn thực sự phải làm, thì đó là những gì bạn phải làm. Nhưng nếu đó không phải là những gì bạn phải làm thì sao?

Tôi đã xây dựng một cơ sở dữ liệu EAV được sử dụng trong một doanh nghiệp. Ơn trời, bộ dữ liệu nhỏ (mặc dù có hàng tá loại vật phẩm) nên hiệu suất không tệ. Nhưng sẽ thật tệ nếu cơ sở dữ liệu có hơn vài nghìn mục trong đó! Ngoài ra, các bảng rất khó truy vấn. Kinh nghiệm này đã khiến tôi thực sự mong muốn tránh các cơ sở dữ liệu EAV trong tương lai nếu có thể.

Bây giờ, trong cơ sở dữ liệu của tôi, tôi đã tạo một thủ tục được lưu trữ để tự động xây dựng các chế độ xem PIVOTed cho mỗi và mọi kiểu con tồn tại. Tôi chỉ có thể truy vấn từ AutoDoohickey. Siêu dữ liệu của tôi về các kiểu con có cột "Tên ngắn" chứa tên an toàn đối tượng phù hợp để sử dụng trong tên xem. Tôi thậm chí đã làm cho các lượt xem cập nhật! Thật không may, bạn không thể cập nhật chúng khi tham gia, nhưng bạn CÓ THỂ chèn cho chúng một hàng đã tồn tại, sẽ được chuyển đổi thành CẬP NHẬT. Thật không may, bạn không thể chỉ cập nhật một vài cột, vì không có cách nào để chỉ ra VIEW mà cột bạn muốn cập nhật với quy trình chuyển đổi INSERT-to-UPDATE: giá trị NULL trông giống như "cập nhật cột này thành NULL" ngay cả khi bạn muốn chỉ ra "Đừng cập nhật cột này."

Mặc dù tất cả các trang trí này để làm cho cơ sở dữ liệu EAV dễ sử dụng hơn, tôi vẫn không sử dụng các chế độ xem này trong hầu hết các truy vấn thông thường vì nó là SLOW. Các điều kiện truy vấn không phải là vị ngữ được đẩy trở lại Valuebảng, do đó, nó phải xây dựng một tập kết quả trung gian của tất cả các mục thuộc loại của chế độ xem đó trước khi lọc. Ôi. Vì vậy, tôi có rất nhiều, rất nhiều truy vấn với nhiều, nhiều tham gia, mỗi lần truy cập để nhận được một giá trị khác nhau, v.v. Họ thực hiện tương đối tốt, nhưng ouch! Đây là một ví dụ. SP tạo ra thứ này (và kích hoạt cập nhật của nó) là một con quái vật khổng lồ và tôi tự hào về nó, nhưng nó không phải là thứ bạn muốn cố gắng duy trì.

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;

Đây là một loại chế độ xem được tạo tự động khác được tạo bởi một thủ tục được lưu trữ khác từ siêu dữ liệu đặc biệt để giúp tìm mối quan hệ giữa các mục có thể có nhiều đường dẫn giữa chúng (Cụ thể: Module-> Server, Module-> Cluster-> Server, Module-> DBMS- > Máy chủ, Mô-đun-> DBMS-> Cụm-> Máy chủ):

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

Phương pháp lai

Nếu bạn PHẢI có một số khía cạnh động của cơ sở dữ liệu EAV, bạn có thể xem xét việc tạo siêu dữ liệu như thể bạn có một cơ sở dữ liệu như vậy, nhưng thay vào đó thực sự sử dụng mẫu thiết kế siêu kiểu / kiểu con. Có, bạn sẽ phải tạo các bảng mới, thêm và xóa và sửa đổi các cột. Nhưng với quá trình tiền xử lý thích hợp (như tôi đã làm với chế độ xem Tự động của cơ sở dữ liệu EAV của tôi), bạn có thể có các đối tượng giống như bảng thực sự để làm việc. Chỉ có điều, chúng sẽ không sởn gai ốc như của tôi và trình tối ưu hóa truy vấn có thể dự đoán được đẩy xuống các bảng cơ sở (đọc: thực hiện tốt với chúng). Sẽ chỉ có một liên kết giữa bảng supertype và bảng subtype. Ứng dụng của bạn có thể được thiết lập để đọc siêu dữ liệu để khám phá những gì nó phải làm (hoặc nó có thể sử dụng các chế độ xem được tạo tự động trong một số trường hợp).

Hoặc, nếu bạn đã có một bộ các kiểu con đa cấp, chỉ cần một vài phép nối. Theo đa cấp, ý tôi là khi một số kiểu con chia sẻ các cột chung, nhưng không phải tất cả, bạn có thể có một bảng kiểu con cho những bảng mà chính nó là siêu kiểu của một vài bảng khác. Ví dụ: nếu bạn đang lưu trữ thông tin về Máy chủ, Bộ định tuyến và Máy in, một kiểu con trung gian của "Thiết bị IP" có thể có ý nghĩa.

Tôi sẽ đưa ra lời cảnh báo rằng tôi chưa tạo ra một cơ sở dữ liệu siêu trang trí / siêu mẫu lai EAV như tôi đang đề nghị ở đây để thử trong thế giới thực. Nhưng những vấn đề tôi gặp phải với EAV không hề nhỏ và việc làm một cái gì đó có lẽ là điều bắt buộc nếu cơ sở dữ liệu của bạn sẽ lớn và bạn muốn có hiệu năng tốt mà không cần một số phần cứng khổng lồ đắt tiền.

Theo tôi, thời gian tự động hóa việc sử dụng / tạo / sửa đổi các bảng phụ thực sự cuối cùng sẽ là tốt nhất. Tập trung vào tính linh hoạt được điều khiển bởi dữ liệu làm cho âm thanh EAV trở nên hấp dẫn (và tin tôi đi, tôi thích làm thế nào khi ai đó hỏi tôi một thuộc tính mới trên loại phần tử tôi có thể thêm nó trong khoảng 18 giây và họ có thể bắt đầu nhập dữ liệu ngay trên trang web ). Nhưng sự linh hoạt có thể được thực hiện theo nhiều cách! Tiền xử lý là một cách khác để làm điều đó. Đó là một phương pháp mạnh mẽ mà rất ít người sử dụng, mang lại lợi ích của việc hoàn toàn dựa trên dữ liệu nhưng hiệu suất của việc được mã hóa cứng.

(Lưu ý: Có, các chế độ xem thực sự được định dạng như vậy và các chế độ xem PIVOT thực sự có trình kích hoạt cập nhật. :) Nếu ai đó thực sự quan tâm đến các chi tiết đau đớn khủng khiếp của trình kích hoạt CẬP NHẬT dài và phức tạp, hãy cho tôi biết và tôi sẽ đăng một mẫu cho bạn.)

Và thêm một ý tưởng

Đặt tất cả dữ liệu của bạn vào một bảng. Đặt tên chung cho các cột và sau đó sử dụng lại / lạm dụng chúng cho nhiều mục đích. Tạo quan điểm về những điều này để cung cấp cho họ tên hợp lý. Thêm các cột khi cột không sử dụng loại dữ liệu phù hợp không có sẵn và cập nhật chế độ xem của bạn. Mặc dù chiều dài của tôi đang diễn ra về subtype / supertype, đây có thể là cách tốt nhất.


Tôi nghĩ về thiết kế này trong đó mỗi bảng phụ có PK từ cha mẹ và các trường không phổ biến. Tôi nghĩ rằng tôi có thể đặt trường loại trong bảng cha và từng bảng phụ và sau đó đặt một ràng buộc KIỂM TRA cho chúng. Tôi quyết định tránh thiết kế này bởi vì nó sẽ yêu cầu một bảng mới bất cứ khi nào một loại thiết bị mới cần được theo dõi và nhiều mối quan hệ một-một. Nó có vẻ lộn xộn và không linh hoạt. Tôi đánh giá cao đầu vào của bạn mặc dù.
TheSecretSquad 17/03/2016

Tôi đã xây dựng một cơ sở dữ liệu EAV được sử dụng trong một doanh nghiệp. Ơn trời, bộ dữ liệu nhỏ (mặc dù có hàng tá loại vật phẩm) nên hiệu suất không tệ. Nhưng nó sẽ là nếu cơ sở dữ liệu có hơn một vài ngàn mục trong đó. Kinh nghiệm này đã khiến tôi thực sự mong muốn tránh các cơ sở dữ liệu EAV trong tương lai nếu có thể, bởi vì chúng rất khó để truy vấn.
ErikE

Ngoài ra, thời gian tự động hóa việc sử dụng / tạo / sửa đổi các bảng phụ thực sự, theo tôi, cuối cùng sẽ là tốt nhất.
ErikE

Sau khi kiểm tra mẫu EAV tôi nhận ra rằng các giá trị cho các thuộc tính buộc phải chia sẻ một kiểu dữ liệu (tất cả các chuỗi trong trường hợp này). Ngoài ra, truy vấn thiết lập EAV sẽ là một việc vặt. Supertype / subtype là tìm kiếm tốt hơn. Câu hỏi của tôi bây giờ, là các bảng nhất định chỉ cho phép các loại thiết bị cụ thể. Tôi có xác thực điều này bằng cách đặt ID lớp thiết bị (điện thoại, máy tính, bộ định tuyến) vào mỗi bảng và đặt ràng buộc kiểm tra trên trường đó hay tôi loại trừ trường đó khỏi các bảng phụ và sử dụng trình kích hoạt trên mỗi bảng? Vui lòng xem ERD3 để tham khảo.
TheSecretSquad 18/03 '

1
Để truy vấn dữ liệu EAV, không có gì lạ khi xây dựng một bảng dữ liệu của các bảng quan hệ cho dữ liệu bạn muốn truy vấn và sau đó điền chúng bằng cách sử dụng một số tập lệnh. Các truy vấn sẽ chạy nhanh hơn, nhưng chỉ dựa vào dữ liệu bạn đặt trong bảng dữ liệu và thiết lập yêu cầu một chút lập kế hoạch.
Thất vọngWithFormsDesigner

6

Trong trường hợp của bạn, cách tiếp cận tốt nhất là một biến thể trên mô hình Thực thể-Thuộc tính-Giá trị (EAV). Có rất nhiều người né tránh EAV vì nó không có ích trong một số cách và sử dụng sai rất nhiều thời gian. Tuy nhiên, EAV là một giải pháp hoạt động tốt cho các yêu cầu cụ thể của bạn.

Biến thể mà bạn muốn đưa vào cho tình huống của mình là trừu tượng hóa các thuộc tính một cấp khỏi các thực thể của bạn (tức là các mặt hàng tồn kho của bạn). Về cơ bản, bạn muốn xác định loại thiết bị có danh sách các thuộc tính. Sau đó, bạn xác định các phiên bản thiết bị có giá trị cho từng thuộc tính mà thiết bị thuộc loại đó được cho là có.

Đây là một bản phác thảo ERD:

ERD

DEVICE_ATTRIBUTEchứa các giá trị cho từng loại thuộc tính chung. DEVICE_TYPEđịnh nghĩa danh sách các thuộc tính chung áp dụng cho một loại thiết bị nhất định (đây là các thuộc tính TYPICAL_DEVICE_ATTRIBUTEs.

Điều này cho phép bạn kiểm soát các thuộc tính nào cần được điền cho một thiết bị trong khi cho phép các thiết bị thuộc loại khác có danh sách các thuộc tính khác nhau. Nó cũng giúp bạn dễ dàng so sánh giữa các thiết bị bằng cách xếp các thuộc tính của chúng lên nhau.


Điều này trông tương tự như những gì ssmusoke đề nghị. Tôi đã thay đổi ERD của mình bằng khuyến nghị của anh ấy và có vẻ như nó phù hợp với bạn. Vui lòng kiểm tra RD mới tại http://www.dividegraphics.com/ERD2.jpg và cung cấp bất kỳ phản hồi nào.
TheSecretSquad

@reallythecrash - Bạn nói đúng, tôi đang đề xuất cách tiếp cận cơ bản giống như ssmusoke, tôi chỉ thực hiện một câu trả lời khác với hy vọng giúp dễ hiểu hơn về cấu trúc của mô hình và cả lý do sử dụng EAV mà nhiều người (không công bằng) tố cáo là chống mẫu.
Joel Brown

Sau một số nghiên cứu tôi thấy tại sao mọi người có thể coi EAV là một mô hình chống. Tôi nghĩ việc lưu trữ dữ liệu bằng EAV là đơn giản, nhưng đặc biệt phức tạp đối với việc truy vấn và duy trì các loại dữ liệu. Tôi nghĩ rằng đó là một mô hình với mục đích hẹp và nên được sử dụng bởi các nhà phát triển có kinh nghiệm, những người có thể thực hiện nó đúng cách, tức là không phải tôi. Tôi có thể sẽ chọn cho mô hình supertype / subtype.
TheSecretSquad

@JoelBrown - bạn đã sử dụng phần mềm nào để phác thảo sơ đồ đó?, Trông thật tuyệt.
Vidar

@Vidar - Tôi đã sử dụng Visio với smartshapes ERD mà tôi đã tạo để sử dụng các quy ước trực quan của James Martin và được vẽ bằng một mẫu đường tùy chỉnh sơ sài. Tôi thấy đây là một công cụ tốt để sử dụng cho các mô hình dữ liệu nhanh / dự thảo. Khi sơ đồ quá trang trọng, nó có thể khiến một số người nghĩ rằng nó đã hoàn thành, do đó, một cái gì đó sơ sài sẽ giúp ngăn mọi người đi đến kết luận về mức độ vững chắc của một mô hình dữ liệu.
Joel Brown

1
  1. Cách tiếp cận tổng thể như sau:

a) Cách tiếp cận mô hình Thực thể-Thuộc tính-Giá trị để giải quyết các thuộc tính của các thiết bị khác nhau đối với loại thiết bị. Mỗi loại thiết bị sẽ có một danh sách các thuộc tính có giá trị bạn theo dõi

b) Đối với mỗi loại thiết bị, bạn theo dõi chi tiết hàng tồn kho theo số sê-ri tương ứng với một thiết bị.

  1. Vì vậy, bạn sẽ kết thúc với các bảng sau:

a) Thuộc tính - xác định các thuộc tính cho tất cả các thiết bị (mọi thứ trong bảng này) các cột: id, name, description

b) Thuộc tính vật phẩm - xác định các thuộc tính được phép cho một thiết bị cụ thể - itemid, propertyid

c) Định nghĩa vật phẩm - định nghĩa một mặt hàng nói Black Berry Torch 4500, Iphone 4S, Iphone 3S, v.v. - id, tên, mô tả, categoryid (nếu bạn muốn thêm các danh mục như điện thoại di động, thiết bị chuyển mạch, v.v.)

d) Thiết bị - các thiết bị riêng lẻ - id, itemid, Inventdate, hủy kích hoạt, serialnumber ... (về cơ bản là tất cả các thuộc tính khác cho một thiết bị)

Nếu bạn muốn theo dõi bất kỳ thông tin nào khác về chuyển đổi thiết bị thì bạn có thể thêm nhiều bảng được liên kết với thiết bị khi bạn cần.


Cảm ơn về thông tin bạn vừa nhập. Đây là nội tuyến với những gì tôi đang tìm kiếm, tôi không thể tìm ra cách để làm điều đó. Tôi đã thay đổi ERD của tôi để phản ánh thông số kỹ thuật của bạn. Có vẻ như nó đòi hỏi nhiều công việc hơn để nhập tất cả các thuộc tính được phép cho từng loại thiết bị, nhưng cũng có vẻ như nó cung cấp sự linh hoạt tối đa. Tôi sẽ tạo ra một nguyên mẫu nhỏ để xem nó có hoạt động theo cách tôi nghĩ không. Cảm ơn một lần nữa. Tôi đã tải lên một ERD với các thay đổi nếu bạn muốn xem và cho tôi biết nếu tôi đang đi đúng hướng. http://www.dividegraphics.com/ERD2.jpg
TheSecretSquad 17/03/2016

Vâng, bạn đang đi đúng hướng.
Stephen Senkomago Musoke 18/03 '

EAV sẽ cung cấp rất nhiều tính linh hoạt, nhưng bạn cũng có nhiều siêu dữ liệu hơn để giữ cho nó hoạt động.
Thất vọngWithFormsDesigner

@FrustratedWithFormsDesigner dường như không thể tránh khỏi khi hệ thống lưu trữ một loạt các mặt hàng, điện thoại, thiết bị chuyển mạch, máy tính xách tay, vv ... Siêu dữ liệu tốt hơn nhiều bảng tôi sẽ nói
Stephen Senkomago Musoke

1
@ssmusoke: Đồng ý, nhưng tôi muốn nhấn mạnh điểm đó vì tôi đã thấy mọi người không nhận ra tầm quan trọng của siêu dữ liệu và sau đó việc triển khai EAV của họ trở thành một cơn ác mộng.
Thất vọngWithFormsDesigner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.