2010-03-30 167 views
1

(表示在C#)這是最有可能的一個爲你性感的DBA那裏:建模通用關係數據庫

怎麼會藉此我在有一個領域我effieciently模型關係數據庫定義「SportType」的「Event」表?

這個「SportsType」字段可以保存一個鏈接到不同的運動表E.g. 「FootballEvent」,「RubgyEvent」,「CricketEvent」和「F1事件」。

這些運動表中的每一個都有特定於該運動的其他字段

我的目標是能夠根據需要在未來通用添加運動類型,但將運動特定事件數據(字段)作爲我的事件實體的一部分。

是否有可能使用一個ORM,如NHibernate/Entity framework/DataObjects.NET這會反映這種關係?

我已經一起引發一個快速的C#示例來表達我的意圖在更高層次上:

public class Event<T> where T : new() 
{ 
    public T Fields { get; set; } 

    public Event() 
    { 
     EventType = new T(); 
    } 
} 

public class FootballEvent 
{ 
    public Team CompetitorA { get; set; } 
    public Team CompetitorB { get; set; }  
} 

public class TennisEvent 
{ 
    public Player CompetitorA { get; set; } 
    public Player CompetitorB { get; set; } 
} 

public class F1RacingEvent 
{ 
    public List<Player> Drivers { get; set; } 
    public List<Team> Teams { get; set; } 
} 

public class Team 
{ 
    public IEnumerable<Player> Squad { get; set; } 
} 

public class Player 
{ 
    public string Name { get; set; } 
    public DateTime DOB { get; set;} 
} 

football Event code completion f1 Event code completion

回答

3

DataObjects.Net支持開放泛型自動映射。一些細節在這裏被描述here

+0

鏈接到DO4論壇描述這種情況下一個話題:http://forum.x-tensive.com/viewtopic.php ?F = 29&T = 5820 – 2010-04-01 03:03:43

0

有一堆像XML列和EAV選項(亦稱作爲數據庫中的數據庫),但其中沒有一個能夠很好地與ORM一起轉換爲傳統的靜態面向對象的語言,並且所有這些在數據庫級別的數據類型安全性和參照完整性方面都存在缺陷。

如果您在數據庫和客戶端都需要這種級別的動態結構,那麼您可能需要使用更加動態化的對象或文檔數據庫(和語言) - 關係數據庫傾向於與靜態關係和數據模型。

2

轉換爲DO4必須如下所示的示例:

// I'd add this type - adding an abstract base makes design more clean + allows you to share 
// the behavior among all the descendants 
[Serializable] 
[HierarchyRoot] 
public abstract class EventBase : Entity 
{ 
    [Key] 
    Guid Id { get; private set; } // Or some other type 
} 

[Serializable] 
public class Event<T> : EventBase 
    where T : IEntity, new() // IEntity indicates DO4 must try to map its descendants automatically 
    // Although I'd put some stronger requirement, e.g. by using IEventData instead of IEntity here 
{ 
    public T Data { get; set; } 

    public Event(T data) 
    { 
     Data = data; 
    } 
} 

[Serializable] 
[HierarchyRoot] 
public class FootballEvent 
{ 
    // You need [Key] here 
    public Team CompetitorA { get; set; } 
    public Team CompetitorB { get; set; } 
} 

[Serializable] 
[HierarchyRoot] 
public class TennisEvent 
{ 
    // You need [Key] here 
    public Player CompetitorA { get; set; } 
    public Player CompetitorB { get; set; } 
} 

[Serializable] 
[HierarchyRoot] 
public class F1RacingEvent 
{ 
    // You need [Key] here 
    public EntitySet<Player> Drivers { get; private set; } 
    public EntitySet<Team> Teams { get; private set; } 
} 

[Serializable] 
[HierarchyRoot] 
public class Team 
{ 
    // You need [Key] here 
    public EntitySet<Player> Squad { get; set; } 
} 

[Serializable] 
[HierarchyRoot] 
public class Player 
{ 
    public string Name { get; set; } 
    public DateTime DOB { get; set; } 
} 

在這種情況下的事件實例將可用(=自動映射),用於從模型中的所有合適的TS。例如。在這種情況下,他們會: - EventBase //是的,即使它,因爲它是適合 - FootballEvent - TennisEvent - F1RacingEvent - 團隊 - 玩家

如果你想限制這只是某些類型,您必須執行以下操作: - 添加從IEntity繼承的接口,所有這些類型都將支持,例如IEventData。 - 將其用作Event中通用參數T的通用參數約束。

十字發佈來自:http://forum.x-tensive.com/viewtopic.php?f=29&t=5820, 回答Alex Yakunin, 首席執行官DataObjects.NET