6

すべてに幸せな新年!私はTool Hiringビジネスを実行するクライアントのためのASP.NET MVC 5アプリケーションのデータモデリングを始めました。ソリューションの一部には、管理者が特定のツールグループの各ツールに添付されたカスタム属性またはツールメタデータを作成/編集できる管理(バックエンド)機能の構築が含まれます。私は、実行時にアプリケーションがメタデータスキーマが何であるかを知るべきではないという考えに取り組んでいます。だから私はこれで始まった: enter image description here ええ、私は知っている... 別のEAVの悪夢!データが正しく正規化され、関連するインデックスが作成されていれば、それほど悪くないはずです。しかし、正直言って、私は他の選択肢を見ません。ですから、例えば:EntityFramework 6 - ユーザー定義の属性の処理

ボッシュコードレスドリル

  • ツールグループ:ドリル
  • ブランド:ボッシュ(のListItem - MetaAttributeListOptionテーブルから事前に設定)
  • タイプ:コードレス(listItemの - MetaAttributeListOptionテーブルから事前に設定)
  • キーレスチャック:はい(ブール)
  • 電圧:14.4ボルト(テキスト)
  • ...これらの属性は、3つの目的に役立つであろう今

:フロントエンドにフィルタリングツールのために使用される "仕様"

  • としてフロントエンドに

    1. 表示を
    2. は(潜在的に)への報告で使用

    だから、私はこれのためにRDBMS(SQL Server)がついていると思います。私はこれに向けた一般的なアプローチはNoSQLソリューションを使用することであることを知っていますが、正直言って私はそれをMSSQLと組み合わせて使用​​するための実践的な経験はほとんどありません。私はValuesテーブルをそれぞれのデータ型の値が独自の列にある1つのテーブルに結合することができますが、それは私に争うために多くのnullを残します。

    あなたは親切で私を助けることができるのであれば、私は次のような質問が残っています:

    1. は私の要件の面でこのモデルの仕事をしていますか?私はMetaAttributeListOptionテーブルの関係を正しく設計しているかどうかはわかりません。
    2. このEAVアプローチに代わる方法はありますか?
    3. 上記のモデル(またはその派生物)が私の唯一の選択肢であると仮定して、Entity Framework 6でこれをどのように実装しますか?管理バックエンドのASPビューページでは、適切なエディタをレンダリングしてそれに応じて設定するために、何らかのHTMLヘルパーが必要になると思います。

    これについては、StackOverflowコミュニティからのご支援をいただき、誠にありがとうございます。私の質問がプログラミングに関連していると信じているので、あなたがより多くの情報を必要としているかどうか教えてください。ありがとうございました!


    EDIT: 私は質問3.感謝のための私の質問に1 & 2、及び100ポイントを私に助言/ ...自分のポイントのこの価値は200に恵みを開始する支援のための100よあなた

  • 答えて

    2
    1. 重複がたくさんある場合に冗長OptionLabelsを作成することができたことを除いて、問題のモデルは実行可能になります、と関係が正しく設定します。しかし、いくつかの変更や標準化の妥協案があります。私はRDBMSを使用して、私はいくつかの他の開発者に使用され、以下に示すアプローチを見てきました

    2. あなたの最善の策だと思うMSSQLを使用してフィルタリングして

    3. と報告要件、および相対的な快適さ(#3を参照してください) 「API、および私が1つのリストが複数MetaAttributesに適用できるようにMetaAttributeListを追加しましたあまり正規化されて良い十分な妥協のようですが、データモデルが単純になり、より柔軟

      • 値を照会。このモデルでは、ブーリアンはYes/No ListOptionとして表されます。
      • 質問のモデルは、値の検索には3つのテーブル(の一つ)を調べ、該当MetaAttributeは常に事前
      • に疑問のモデルを知られることは、EFコードファーストと、デフォルトでは、複数の問題を持っているということが必要となります
      • このアプローチでは、有効なListOptionエントリをデータベースではなくコードで処理する必要があります(オプションで?)。
      • 異なる種類の値を表示すると、適切にレンダリングするための追加作業は必要ありません。
      • 管理インタフェース(ListItemOptionsはい/いいえであれば、おそらく、チェックボックス)

      • あなたが狭くToolGroupsのために別のテーブルを追加することができますテキストボックスまたはリストアイテムを表示するかどうかを判断するためにMetaAttribute.ListOptionをチェックする必要がありますMetaAttributesは、ユーザーに

    注意を提示:EF方法や言語が指定されていなかったので、私はEFコードファーストとVB.Netを使用しました。 IMOの移行とEF7への簡単な移行は、Code Firstを使用するのに十分な理由です。私はVB.Netの可読性を少し良くするのが好きですが、必要ならばC#に喜んで変更します(またはthisコンバータを使用してください)。

    Imports System.ComponentModel.DataAnnotations 
    Namespace Models 
        'I didn't bother specifying string lengths with <StringLength(#)> 
        Public Class HireTool 
         Public Property Id As Integer 
         '... other properties 
    
         'Navigation Properties 
         Public Overridable Property HireToolMetaAttributes As ICollection(Of HireToolMetaAttribute) 
        End Class 
        Public Class MetaAttribute 
         Public Enum MetaAttributeTypeEnum 
          Text = 1 
          ListItem = 2 
         End Enum 
         Public Property Id As Integer 
         Public Property Code As String 
         Public Property Label As String 
         Public Property Type As MetaAttributeTypeEnum 
         Public Property Required As Boolean 
         Public Property Position As Integer 
         'Navigation Properties 
         Public Overridable Property List As MetaAttributeList 
        End Class 
        Public Class MetaAttributeList 
         Public Property ID As Integer 
         Public Property Name As String 
         'Navigation Properties 
         <Required> 
         Public Property ListOptions As ICollection(Of MetaAttributeListOption) 
        End Class 
        Public Class MetaAttributeListOption 
         Public Property Id As Integer 
         Public Property OptionLabel As String 
        End Class 
        Public Class HireToolMetaAttribute 
         Public Property Id As Integer 
         <Schema.Index> <StringLength(1000)> 
         Public Property Value As String 
         <Required> 
         Public Overridable Property HireTool As HireTool 
         <Required> 
         Public Overridable Property MetaAttribute As MetaAttribute 
        End Class 
    End Namespace   
    

    編集:

    CREATE TABLE [dbo].[MetaAttributeLists] (
        [ID] INT   IDENTITY (1, 1) NOT NULL, 
        [Name] NVARCHAR (MAX) NULL, 
        CONSTRAINT [PK_dbo.MetaAttributeLists] PRIMARY KEY CLUSTERED ([ID] ASC) 
    ); 
    CREATE TABLE [dbo].[HireTools] (
        [Id] INT IDENTITY (1, 1) NOT NULL, 
        CONSTRAINT [PK_dbo.HireTools] PRIMARY KEY CLUSTERED ([Id] ASC) 
    ); 
    CREATE TABLE [dbo].[MetaAttributeListOptions] (
        [Id]     INT   IDENTITY (1, 1) NOT NULL, 
        [OptionLabel]   NVARCHAR (MAX) NULL, 
        [MetaAttributeList_ID] INT   NULL, 
        CONSTRAINT [PK_dbo.MetaAttributeListOptions] PRIMARY KEY CLUSTERED ([Id] ASC), 
        CONSTRAINT [FK_dbo.MetaAttributeListOptions_dbo.MetaAttributeLists_MetaAttributeList_ID] FOREIGN KEY ([MetaAttributeList_ID]) REFERENCES [dbo].[MetaAttributeLists] ([ID]) 
    ); 
    CREATE TABLE [dbo].[MetaAttributes] (
        [Id]  INT   IDENTITY (1, 1) NOT NULL, 
        [Code]  NVARCHAR (MAX) NULL, 
        [Label] NVARCHAR (MAX) NULL, 
        [Type]  INT   NOT NULL, 
        [Required] BIT   NOT NULL, 
        [Position] INT   NOT NULL, 
        [List_ID] INT   NULL, 
        CONSTRAINT [PK_dbo.MetaAttributes] PRIMARY KEY CLUSTERED ([Id] ASC), 
        CONSTRAINT [FK_dbo.MetaAttributes_dbo.MetaAttributeLists_List_ID] FOREIGN KEY ([List_ID]) REFERENCES [dbo].[MetaAttributeLists] ([ID]) 
    ); 
    CREATE TABLE [dbo].[HireToolMetaAttributes] (
        [Id]    INT    IDENTITY (1, 1) NOT NULL, 
        [Value]   NVARCHAR (1000) NULL, 
        [HireTool_Id]  INT    NOT NULL, 
        [MetaAttribute_Id] INT    NOT NULL, 
        CONSTRAINT [PK_dbo.HireToolMetaAttributes] PRIMARY KEY CLUSTERED ([Id] ASC), 
        CONSTRAINT [FK_dbo.HireToolMetaAttributes_dbo.HireTools_HireTool_Id] FOREIGN KEY ([HireTool_Id]) REFERENCES [dbo].[HireTools] ([Id]) ON DELETE CASCADE, 
        CONSTRAINT [FK_dbo.HireToolMetaAttributes_dbo.MetaAttributes_MetaAttribute_Id] FOREIGN KEY ([MetaAttribute_Id]) REFERENCES [dbo].[MetaAttributes] ([Id]) ON DELETE CASCADE 
    ); 
    GO 
    CREATE NONCLUSTERED INDEX [IX_Value] 
        ON [dbo].[HireToolMetaAttributes]([Value] ASC); 
    GO 
    CREATE NONCLUSTERED INDEX [IX_HireTool_Id] 
        ON [dbo].[HireToolMetaAttributes]([HireTool_Id] ASC); 
    GO 
    CREATE NONCLUSTERED INDEX [IX_MetaAttribute_Id] 
        ON [dbo].[HireToolMetaAttributes]([MetaAttribute_Id] ASC); 
    GO 
    CREATE NONCLUSTERED INDEX [IX_MetaAttributeList_ID] 
        ON [dbo].[MetaAttributeListOptions]([MetaAttributeList_ID] ASC); 
    GO 
    CREATE NONCLUSTERED INDEX [IX_List_ID] 
        ON [dbo].[MetaAttributes]([List_ID] ASC); 
    
    +0

    うわー、ちょっとデイブ:ここで生成されたSQLです!総合的な返答をありがとう。読んで理解し、実装する時間を許してください。ご質問やご意見がありましたら、私はここに投稿していきます:) – Shalan

    +0

    ご指定いただけません - 私はEF Code Firstを使用していますが、C#を使用しています。しかし、私は完全にあなたのVBを変換する快適です – Shalan

    +0

    私はそれが包括的であることがわかったことをうれしく思っています:)幸いにも私は自分自身のために非常に似たモデルを作成していたので、書き込みとテストのために。ソースの不足のため申し訳ありませんが、私はこのパターンを見たところで私の記憶は少し曖昧です。 –