Sha*_*lan 6 data-modeling entity-attribute-value entity-framework-6 asp.net-mvc-5
祝大家新年快乐!我刚刚开始为运行工具招聘业务的客户端建模ASP.NET MVC 5应用程序.部分解决方案涉及构建管理(后端)功能,管理员用户可以通过该功能创建/编辑从特定工具组附加到每个工具的自定义属性或工具元数据.我正在研究的概念是,在运行时,应用程序不应该知道元数据架构将是什么.所以我从这开始:
是的,我知道...... 另一个EAV噩梦!我知道如果数据被正确地规范化,并且创建了相关的索引,那么它应该不会太糟糕.但老实说,我没有看到任何其他选择.例如:
博世无绳电钻
MetaAttributeListOption表中预填充)MetaAttributeListOption表中预填充)现在这些属性将用于3个目的:
所以我想我为此坚持使用RDBMS(SQL Server).我知道对此采用一种流行的方法是使用一些NoSQL解决方案,但说实话,我没有太多的实践经验来与MSSQL一起使用它.我可以将Values表组合成一个表,其中每个数据类型值都在它自己的列中,但这将留下很多空值来应对.
如果你能帮助我,我会留下以下问题:
MetaAttributeListOption是否正确设计了桌子的关系.我非常感谢StackOverflow社区提供的任何帮助.如果您需要更多信息,请告诉我,如果您认为不合适,请不要关闭此信息,因为我认为我的问题与编程相关.谢谢!
编辑: 我在这个值得我自己积分的200分钟上开始给予奖励...... 100个用于协助/建议我的问题1和2,以及100分的问题3.谢谢
该问题的模型看起来可行,并且关系配置正确,但如果存在大量重复项,则可能会创建冗余选项标签。然而,我会做出一些改变和非规范化妥协。(参见#3)
考虑到您的过滤和报告要求,以及对 MSSQL 的相对熟悉程度,我认为使用 RDBMS 是您最好的选择
我已经看到下面显示的方法在其他一些开发人员的 API 中使用,它似乎是一个足够好的折衷方案,虽然规范化程度较低,但使数据模型更简单并且查询值更加灵活
管理界面需要检查 MetaAttribute.ListOption 以确定是否显示 TextBox 或 ListItem(如果 ListItemOptions 为 Yes/No,则可能显示一个复选框)
您可能需要为工具组添加另一个表,以缩小呈现给用户的元属性范围
注意:由于未指定 EF 方法和语言,因此我使用了 EF Code First 和 VB.Net。IMO 迁移和更轻松地过渡到 EF7 足以成为使用 Code First 的理由。我更喜欢 VB.Net 的可读性,但如果需要的话我会很乐意更改为 C#(或使用此转换器)。
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
Run Code Online (Sandbox Code Playgroud)
编辑:这是生成的 SQL:
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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |