MVC實用構架設計(三)——EF-Code First(2):實體對映、資料遷移,重構
〇、目錄
一、前言
二、實體對映
三、資料遷移
四、程式碼重構
五、原始碼獲取
六、系列導航
一、前言
經過EF的《第一篇》,我們已經把資料訪問層基本搭建起來了,但並沒有涉及實體關係。實體關係對於一個數據庫系統來說至關重要,而且EF的各個實體之間的聯絡,實體之間的協作,聯合查詢等也都依賴於這些實體關係。
二、實體對映
實體與資料庫的對映可以通過DataAnnotation與FluentAPI兩種方式來進行對映:
(一) DataAnnotation
DataAnnotation 特性由.NET 3.5中引進,給.NET中的類提供了一種新增驗證的方式。DataAnnotation由名稱空間System.ComponentModel.DataAnnotations提供。下面列舉實體模型中常用的DataAnnotation特性:
- KeyAttribute:對應資料庫中的主鍵
- RequiredAttribute:對應資料庫中欄位的資料是否可以為null
- MaxLengthAttribute:對應資料庫中字串型別欄位的最大長度
- MinLengthAttribute:在資料庫中無對應,但在程式碼中字串最小長度
- ConcurrencyCheckAttribute:指定用於開放式併發檢查的列的資料型別
- TimestampAttribute:將列的資料型別指定為行版本
System.ComponentModel.DataAnnotations名稱空間中只定義了部分實體驗證的特性,在EntityFramework程式集中定義了更多的資料對映特性:
- DatabaseGeneratedAttribute:標記指定實體屬性是由資料庫生成的,並指定生成策略(None資料庫不生成值,Identity當插入行時,資料庫生成值,Computed當插入或更新行時,資料庫生成值)
- ColumnAttribute:指定實體屬性在資料庫中的列名及資料型別
- TableAttribute:指定實體類對應的資料表名
- ForeignKeyAttribute:指定導航屬性的外來鍵欄位
- NotMappedAttribute:標記指定實體屬性在建立資料庫中不建立對應欄位
- ComplexTypeAttribute:標記指定實體屬性是將一個物件作為另一個物件的屬性,對映到資料庫中則子物件表現為多個屬性欄位
對於實體關係對應的資料表關係,無非“0:1,1:1,0:N,1:N,N:N”這幾種,可以使用導航屬性中的資料型別來表示,0…1端使用單實體型別表示,N端使用ICollection<T>集合型別表示。對於單實體端,預設是可為空的,即為0關係,如果要設定為1關係,要使用[Required]標籤來進行標記。但對於一對一中的關係主體與依賴物件確無法做更細節的控制。
(二) Fluent API
使用DataAnnotation非常簡單,但對於EntityFramework中的特性,就要在實體類中引入EntityFramework程式集,但實體類最好能是保持與架構無關性的POCO類,才能更具通用性。所以,最好是在資料層中使用FluentAPI在資料層中進行實體類與資料庫之間的對映工作。
當然,System.ComponentModel.DataAnnotations名稱空間的DataAnnotation在EntityFramework程式集中也有相應的API:
- HasKey - KeyAttribute:配置此實體型別的主鍵屬性
- IsRequired - RequiredAttribute:將此屬性配置為必需屬性。用於儲存此屬性的資料庫列將不可以為null
- HasMaxLength - MaxLengthAttribute:將屬性配置為具有指定的最大長度
- IsConcurrencyToken - ConcurrencyCheckAttribute:將屬性配置為用作開放式併發標記
- IsRowVersion - TimestampAttribute:將屬性配置為資料庫中的行版本。實際資料型別將因使用的資料庫提供程式而異。將屬性設定為行版本會自動將屬性配置為開放式併發標記。
上面這些API均無需引用EntityFramework,推薦使用DataAnnotation方式來設定對映。
以下API的DataAnnotation特性是在EntityFramework中定義,如果也使用DataAnnotation方式來設定對映,就會給實體類增加額外的第三方程式集的依賴。所以以下API的對映推薦使用FluentAPI的方式來設定對映:
- ToTable - TableAttribute:配置此實體型別對映到的表名
- HasColumnName - ColumnAttribute:配置用於儲存屬性的資料庫列的名稱
- HasForeignKey - ForeignKeyAttribute:將關係配置為使用在物件模型中的外來鍵屬性。如果未在物件模型中公開外來鍵屬性,則使用Map方法
- Ignore - NotMappedAttribute:從模型中排隊某個屬性,使該屬性不會對映到資料庫
- HasRequired:通過此實體型別配置必需關係。除非指定此關係,否則實體型別的例項將無法儲存到資料庫。資料庫中的外來鍵不可為null。
- HasOptional:從此實體型別配置可選關係。實體型別的例項將能儲存到資料庫,而無需指定此關係。資料庫中的外來鍵可為null。
- HasMany:從此實體型別配置一對多關係。
- WithOptional:將關係配置為required:optional。(required:0…1端的1,表示必需,不可為null;optional:0…1端的0,表示可選,可為null。下同)
- WithOptionalDependent:將關係配置為optional:optional。要配置的實體型別將成為依賴物件,且包含主體的外來鍵。作為關係目標的實體型別將成為關係中的主體。
- WithOptionalPrincipal:將關係配置為optional:optional。要配置的實體型別將成為關係中的主體。作為關係目標的實體型別將成為依賴物件,且包含主體的外來鍵。
- WithRequired:將關係的指定端配置為必需的,且在關係的另一端有導航屬性。
- WithRequiredDependent:將關係配置為required:required。要配置的實體型別將成為依賴物件,且包含主體的外來鍵。作為關係目標的實體型別將成為關係中的主體。
- WithRequiredPrincipal:將關係配置為required:required。要配置的實體型別將成為關係中的實體。作為關係目標的實體型別將成為依賴物件,且包含主體的外來鍵。
經常用到的DataAnnotation與FluentAPI列舉完了,使用上還是遵守這個原則:
如果在System.ComponentModel.DataAnnotations名稱空間存在相應的標籤,就使用 DataAnnotation 的方式,如果不存在,則使用 FluentAPI 的方式。
(三) 對映程式碼示例
實體類關係圖:
上圖是一個以使用者資訊為中心的實體關係圖,關係說明如下:
- 一個使用者可擁有一個可選的使用者擴充套件資訊(1 - 0)
- 一個使用者擴充套件資訊擁有一個必需的所屬使用者資訊(0 - 1)
- 一個使用者擴充套件資訊擁有一個使用者地址資訊(複合型別)
- 一個使用者可對應多個登入日誌資訊(1 - N)
- 一個登入日誌擁有一個必需的所屬使用者資訊(N- 1)
- 一個使用者可以擁有多個角色(N - N)
- 一個角色可以分配給多個使用者(N - N)
實體類定義:
1 namespace GMF.Demo.Core.Models 2 { 3 /// <summary> 4 /// 實體類——使用者資訊 5 /// </summary> 6 [Description("使用者資訊")] 7 public class Member : Entity 8 { 9 public int Id { get; set; } 10 11 [Required] 12 [StringLength(20)] 13 public string UserName { get; set; } 14 15 [Required] 16 [StringLength(32)] 17 public string Password { get; set; } 18 19 [Required] 20 [StringLength(20)] 21 public string NickName { get; set; } 22 23 [Required] 24 [StringLength(50)] 25 public string Email { get; set; } 26 27 /// <summary> 28 /// 獲取或設定 使用者擴充套件資訊 29 /// </summary> 30 public virtual MemberExtend Extend { get; set; } 31 32 /// <summary> 33 /// 獲取或設定 使用者擁有的角色資訊集合 34 /// </summary> 35 public virtual ICollection<Role> Roles { get; set; } 36 37 /// <summary> 38 /// 獲取或設定 使用者登入記錄集合 39 /// </summary> 40 public virtual ICollection<LoginLog> LoginLogs { get; set; } 41 } 42 }
1 namespace GMF.Demo.Core.Models 2 { 3 /// <summary> 4 /// 實體類——使用者擴充套件資訊 5 /// </summary> 6 [Description("使用者擴充套件資訊")] 7 public class MemberExtend : Entity 8 { 9 /// <summary> 10 /// 初始化一個 使用者擴充套件實體類 的新例項 11 /// </summary> 12 public MemberExtend() 13 { 14 Id = CombHelper.NewComb(); 15 } 16 17 public Guid Id { get; set; } 18 19 public string Tel { get; set; } 20 21 public MemberAddress Address { get; set; } 22 23 public virtual Member Member { get; set; } 24 } 25 }
1 namespace GMF.Demo.Core.Models 2 { 3 /// <summary> 4 /// 使用者地址資訊 5 /// </summary> 6 public class MemberAddress 7 { 8 [StringLength(10)] 9 public string Province { get; set; } 10 11 [StringLength(20)] 12 public string City { get; set; } 13 14 [StringLength(20)] 15 public string County { get; set; } 16 17 [StringLength(60, MinimumLength = 5)] 18 public string Street { get; set; } 19 } 20 }
1 namespace GMF.Demo.Core.Models 2 { 3 /// <summary> 4 /// 實體類——登入記錄資訊 5 /// </summary> 6 [Description("登入記錄資訊")] 7 public class LoginLog : Entity 8 { 9 /// <summary> 10 /// 初始化一個 登入記錄實體類 的新例項 11 /// </summary> 12 public LoginLog() 13 { 14 Id = CombHelper.NewComb(); 15 } 16 17 public Guid Id { get; set; } 18 19 [Required] 20 [StringLength(15)] 21 public string IpAddress { get; set; } 22 23 /// <summary> 24 /// 獲取或設定 所屬使用者資訊 25 /// </summary> 26 public virtual Member Member { get; set; } 27 } 28 }
1 namespace GMF.Demo.Core.Models 2 { 3 /// <summary> 4 /// 實體類——角色資訊 5 /// </summary> 6 [Description("角色資訊")] 7 public class Role : Entity 8 { 9 public Role() 10 { 11 Id = CombHelper.NewComb(); 12 } 13 14 public Guid Id { get; set; } 15 16 [Required] 17 [StringLength(20)] 18 public string Name { get; set; } 19 20 [StringLength(100)] 21 public string Description { get; set; } 22 23 /// <summary> 24 /// 獲取或設定 角色型別 25 /// </summary> 26 public RoleType RoleType { get; set; } 27 28 /// <summary> 29 /// 獲取或設定 角色型別的數值表示,用於資料庫儲存 30 /// </summary> 31 public int RoleTypeNum { get; set; } 32 33 /// <summary> 34 /// 獲取或設定 擁有此角色的使用者資訊集合 35 /// </summary> 36 public virtual ICollection<Member> Members { get; set; } 37 } 38 }
1 namespace GMF.Demo.Core.Models 2 { 3 /// <summary> 4 /// 表示角色型別的列舉 5 /// </summary> 6 [Description("角色型別")] 7 public enum RoleType 8 { 9 /// <summary> 10 /// 使用者型別 11 /// </summary> 12 [Description("使用者角色")] 13 User = 0, 14 15 /// <summary> 16 /// 管理員型別 17 /// </summary> 18 [Description("管理角色")] 19 Admin = 1 20 } 21 }
實體類對映:
實體類對映中,關係的對映配置在關係的兩端都可以配置。例如,使用者資訊與登入資訊的 一對多 關係可以在使用者資訊端配置:
HasMany(m => m.LoginLogs).WithRequired(n => n.Member);
等效於在登入日誌資訊端配置:
HasRequired(m => m.Member).WithMany(n => n.LoginLogs);
但是,如果所有的關係對映都在作為主體的使用者資訊端進行配置,勢必造成使用者資訊端配置的臃腫與職責不明。所以,為了保持各個實體型別的職責單一,實體關係推薦在關係的非主體端進行對映。
使用者資訊對映類,使用者資訊是關係的主體,所有的關係都不在此對映類中進行配置
1 namespace GMF.Demo.Core.Data.Configurations 2 { 3 public class MemberConfiguration : EntityTypeConfiguration<Member> 4 { 5 } 6 }
使用者擴充套件資訊對映類,配置使用者擴充套件資訊與使用者資訊的 0:1 關係
1 namespace GMF.Demo.Core.Data.Configurations 2 { 3 public class MemberExtendConfiguration : EntityTypeConfiguration<MemberExtend> 4 { 5 public MemberExtendConfiguration() 6 { 7 HasRequired(m => m.Member).WithOptional(n => n.Extend); 8 } 9 } 10 }
使用者地址資訊對映類,配置使用者地址資訊的複雜型別對映,複雜型別繼承於 ComplexTypeConfiguration<>
1 namespace GMF.Demo.Core.Data.Configurations 2 { 3 public class MemberAddressConfiguration : ComplexTypeConfiguration<MemberAddress> 4 { 5 public MemberAddressConfiguration() 6 { 7 Property(m => m.Province).HasColumnName("Province"); 8 Property(m => m.City).HasColumnName("City"); 9 Property(m => m.County).HasColumnName("County"); 10 Property(m => m.Street).HasColumnName("Street"); 11 } 12 } 13 }
登入記錄資訊對映,配置登入資訊與使用者資訊的 N:1 的關係
1 namespace GMF.Demo.Core.Data.Configurations 2 { 3 public class LoginLogConfiguration : EntityTypeConfiguration<LoginLog> 4 { 5 public LoginLogConfiguration() 6 { 7 HasRequired(m => m.Member).WithMany(n => n.LoginLogs); 8 } 9 } 10 }
角色資訊對映,配置角色資訊與使用者資訊的 N:N 的關係
1 namespace GMF.Demo.Core.Data.Configurations 2 { 3 public class RoleConfiguration : EntityTypeConfiguration<Role> 4 { 5 public RoleConfiguration() 6 { 7 HasMany(m => m.Members).WithMany(n => n.Roles); 8 } 9 } 10 }
對映類的應用:
對映類需要在資料訪問上下文中進行應用才能生效,只要在DbContext的OnModelCreating方法中進行對映配置新增即可。
1 protected override void OnModelCreating(DbModelBuilder modelBuilder) 2 { 3 //移除一對多的級聯刪除約定,想要級聯刪除可以在 EntityTypeConfiguration<TEntity>的實現類中進行控制 4 modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 5 //多對多啟用級聯刪除約定,不想級聯刪除可以在刪除前判斷關聯的資料進行攔截 6 //modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 7 8 modelBuilder.Configurations.Add(new MemberConfiguration()); 9 modelBuilder.Configurations.Add(new MemberExtendConfiguration()); 10 modelBuilder.Configurations.Add(new MemberAddressConfiguration()); 11 modelBuilder.Configurations.Add(new RoleConfiguration()); 12 modelBuilder.Configurations.Add(new LoginLogConfiguration()); 13 }
三、資料遷移
經過上面的折騰,資料庫結構已經大變,專案當然執行不起來了。
根據提示,必須進行遷移來更新資料庫結構。EntityFramework的資料遷移通過 NuGet 來進行。開啟程式包管理器控制檯(Package Manager Console),鍵入“ get-help EntityFramework”命令,可以獲得相關的幫助資訊。
若想了解各個子命令的幫助細節,也可鍵入“get-help 子命令”命令,例如:get-help Enable-Migrations
下面我們來對專案進行資料遷移,在我們的專案中,EntityFramework的依賴止於專案GMF.Demo.Core.Data,專案的資料遷移也是在此專案中進行。遷移步驟如下:
- 在“程式包管理器控制檯”鍵入命令:Enable-Migrations -ProjectName GMF.Demo.Core.Data
- 新增後,專案中添加了一個名為Migrations的資料夾
新增生成以下程式碼:
1 namespace GMF.Demo.Core.Data.Migrations 2 { 3 internal sealed class Configuration : DbMigrationsConfiguration<DemoDbContext> 4 { 5 public Configuration() 6 { 7 AutomaticMigrationsEnabled = false; 8 } 9 10 protected override void Seed(DemoDbContext context) 11 { 12 // This method will be called after migrating to the latest version. 13 14 // You can use the DbSet<T>.AddOrUpdate() helper extension method 15 // to avoid creating duplicate seed data. E.g. 16 // 17 // context.People.AddOrUpdate( 18 // p => p.FullName, 19 // new Person { FullName = "Andrew Peters" }, 20 // new Person { FullName = "Brice Lambson" }, 21 // new Person { FullName = "Rowan Miller" } 22 // ); 23 // 24 } 25 } 26 }
方法Seed中可以進行資料遷移後的資料初始化工作,將在每次遷移之後執行。如上程式碼所示,AddOrUpdate是IDbSet<TEntity>的擴充套件方法,如果指定條件的資料不存在,則會新增,如果存在,會更新。所以,如果資料是通過此方法來初始化的,在與業務更新之後,再次進行資料遷移後,還是會被還原。
還有一個名為InitialCreate的類,配置生成資料庫的細節:1 namespace GMF.Demo.Core.Data.Migrations 2 { 3 public partial class InitialCreate : DbMigration 4 { 5 public override void Up() 6 { 7 CreateTable( 8 "dbo.Roles", 9 c => new 10 { 11 Id = c.Guid(nullable: false), 12 Name = c.String(nullable: false, maxLength: 20), 13 Description = c.String(maxLength: 100), 14 IsDeleted = c.Boolean(nullable: false), 15 AddDate = c.DateTime(nullable: false), 16 Timestamp = c.Binary(nullable: false, fixedLength: true, timestamp: true, storeType: "rowversion"), 17 }) 18 .PrimaryKey(t => t.Id); 19 20 CreateTable( 21 "dbo.Members", 22 c => new 23 { 24 Id = c.Int(nullable: false, identity: true), 25 UserName = c.String(nullable: false, maxLength: 20), 26 Password = c.String(nullable: false, maxLength: 32), 27 NickName = c.String(nullable: false, maxLength: 20), 28 Email = c.String(nullable: false, maxLength: 50), 29 IsDeleted = c.Boolean(nullable: false), 30 AddDate = c.DateTime(nullable: false), 31 Timestamp = c.Binary(nullable: false, fixedLength: true, timestamp: true, storeType: "rowversion"), 32 }) 33 .PrimaryKey(t => t.Id); 34 35 CreateTable( 36 "dbo.MemberExtends", 37 c => new 38 { 39 Id = c.Guid(nullable: false), 40 IsDeleted = c.Boolean(nullable: false), 41 AddDate = c.DateTime(nullable: false), 42 Timestamp = c.Binary(nullable: false, fixedLength: true, timestamp: true, storeType: "rowversion"), 43 Member_Id = c.Int(nullable: false), 44 }) 45 .PrimaryKey(t => t.Id) 46 .ForeignKey("dbo.Members", t => t.Member_Id) 47 .Index(t => t.Member_Id); 48 49 CreateTable( 50 "dbo.LoginLogs", 51 c => new 52 { 53 Id = c.Guid(nullable: false), 54 IpAddress = c.String(nullable: false, maxLength: 15), 55 IsDeleted = c.Boolean(nullable:
相關推薦
MVC實用構架設計(三)——EF-Code First(2):實體對映、資料遷移,重構
〇、目錄 一、前言 二、實體對映 實體關係圖實體類定義實體類對映三、資料遷移 四、程式碼重構 五、原始碼獲取 六、系列導航 一、前言 經過EF的《第一篇》,我們已經把資料訪問層基本搭建起來了,但並沒有涉及實體關係。實體關係對於一個數據庫系統來說至關重要,而且EF的各個實體之間的聯絡,實體之間的協
MVC實用架構設計:使用MEF應用IOC(依賴倒置)(1)
原文地址:http://developer.51cto.com/art/201309/409351.htm 面向介面程式設計,Controller應該只依賴於站點業務層的介面,而不能依賴於具體的實現,否則,就違背了在層之間設定介面的初衷了。 另外,如果上層只依賴於
Entity Framework Code First (三)Data Annotations
pos .cn ase image 希望 編程 create str length Entity Framework Code First 利用一種被稱為約定(Conventions)優於配置(Configuration)的編程模式允許你使用自己的 domain class
EF Code First 使用(一)
上下文 技術分享 上下文對象 nbsp image http ima png 分享 第一步:創建MVC5項目,添加數據庫實體,建立上下文對象。 第二步:創建數據庫和添加數據 EF Code First 使用(一)
小白學習之Code First(三)
數據庫 change chang chan inf 模型 code test nbsp 上下文Context類中的base構造器的幾個方法重置(1、無參 2、database name 3 、 連接字符串) 無參:如果基類base方法中無參,code first將會以 :{
買到了翻新鏡頭(佳能(Canon)EF 70-200mm f/2.8L IS II USM 鏡頭)
單反 鏡頭 假貨 翻新 今天在淘寶上買了一個佳能(Canon)EF 70-200mm f/2.8L IS II USM 鏡頭,收到後,心都涼了,竟然是一只真真正正的翻新機。 如果有條件,和真正的正品比較,才能發現細節問題。下面說說,為什麽不是新鏡頭呢? 1. 開箱味道全新正品應開箱應該有工業產
初識大數據(三. Hadoop與MPP數據倉庫)
事務處理 table 關系型 結構化數據 討論 習慣 事務 開發 cells MPP代表大規模並行處理,這是網格計算中所有單獨節點參與協調計算的方法。 是將任務並行的分散到多個服務器和節點上,在每個節點上計算完成後,將各自部分的結果匯總在一起得到最終的結果。 MPP D
node.js(三 --- stream 管道流 模組化 函式)
一、stream stream是一個抽象的介面,node中有很多物件實現了這個介面。 stream有四種流型別: Readable: 可讀操作; Writable: 可寫操作; Duplex: 可讀可寫操作; Transform:&nbs
最短路問題(三種演算法與路徑還原演算法)
1、Bellman-Ford演算法: 用Bellman-Ford演算法求解單源最短路徑問題,單源最短路徑是指固定一個起點,求它到其他所有點的最短路問題。 struct edge { int from, to, cost; //從頂點from指向頂點to的權值為c
codeforces 735 D. Taxes (三素數||哥德巴赫猜想)
Mr. Funt now lives in a country with a very specific tax laws. The total income of mr. Funt during this year is equal to n (n ≥ 2) burles and the amount o
TCP協議(三次握手和四次握手)
TCP的特性 TCP提供一種面向連線的、可靠的位元組流服務 在一個TCP連線中,僅有兩方進行彼此通訊。廣播和多播不能用於TCP TCP使用校驗和,確認和重傳機制來保證可靠傳輸 TCP使用累積確認 TCP使用滑動視窗機制來實現流量控制,通過動態改變視窗的
A 3D Real Time Fluid Solver Demo (三維實時流體解算器)
最近對流體模擬(Fluid Simulation)很感興趣,參考Jos Stam的paper:Real-Time Fluid Dynamics for Games,擴充套件其2D solver,做了個簡單的3D fluid solver,模擬簡單的流體。Demo以及原始碼在這裡. 大話 實時流體模擬本是計算
EF Code first 和 DDD (領域驅動設計研究)系列一
發的 tex bsp cti 設計 ron 映射 developer devel 在上個公司工作時,開發公司產品的過程中,接觸到了EF Code first. 當時,整個產品的架構都是Lead developer設計建立的,自己也不是特別理解,就趕鴨子上架跟著一起開發了。
小白學習之Code First(二)
文件中 build 默認 dbm pcre student 技術分享 使用 類名 Code First約定: 註:EDMX模板 (SSDL:存儲模型=>數據庫表 ,CSDL:概念模型=>實體,C-S模型=>存儲和概念模型之間的映射關系) System.Da
EF Code First MySql 主從表設計的一些需要註意的內容
col 可能 出錯 程序包管理器 required upd 數據庫 details l數據庫 假如有下面兩張表 public class Main { public int Id{get;set;} public string Name{get;set}; pub
7.DataAnnotations(數據註解)【Code-First 系列】
分享 image first .data length info ima 系列 .net 轉自https://www.cnblogs.com/caofangsheng/p/5023639.html 關於註解的相關學習網頁 http://www.entityframework
關於面對物件過程中的三大架構以及資料訪問層(實體類、資料操作類)
關於面對物件過程中的三大架構以及資料訪問層(實體類、資料操作類) 面向物件開發專案三層架構: 介面層、業務邏輯層、資料訪問層 資料訪問層,分為實體類和資料訪問類 在專案的下面新增一個App_Code資料夾把所有的類放在App_Code這個資料夾下邊。
字典序問題(演算法課本課後實現題1-2)
題目描述: 在資料加密和資料壓縮中常需要對特殊的字串進行編碼.給定的字母表A由26個小寫英文字母組成,即A={a,b...z}.該字母表產生的升序字串是指定字串中字母從左到右出現的次序與字母在字母表中出現的次序相同,且每個字元最多出
spark2.2.0:記錄一次資料傾斜的解決(擴容join)!
前言: 資料傾斜,一個在大資料處理中很常見的名詞,經由前人總結,現已有不少資料傾斜的解決方案(而且會發現大資料的不同框架的資料傾斜解決思想是一致的,只是實現方法不同),本文重點記錄這次遇到spark處理資料中的傾斜問題。 老話: 菜雞一隻,本人會對文中的結論負責,如果有說錯的,還請各位批評指出
資訊理論複習筆記(1):資訊熵、條件熵,聯合熵,互資訊、交叉熵,相對熵
文章目錄 1.1 資訊和資訊的測量 1.1.1 什麼是資訊 1.1.1 資訊怎麼表示 1.2 資訊熵 1.3 條件熵和聯合熵