zoukankan      html  css  js  c++  java
  • MVC Music Store 在线音乐商店示例分析(1)DataBase

    MVC3发布有一段时间了,一直没有时间来学习。

    最近总算有点闲余时间了,该抓紧搞搞学习,否则就什么都不懂了。

    到http://www.asp.net/MVC 网站上面有个示例叫《Music Store》,把它荡下来学习学习。先从数据库入手。

    将该示例的数据库附加到数据库服务器上。通过PowerDesigner反向生成PhysicalDataModel,然后再生成为ConceptualDataModel。(本人喜欢使用概念模型来分析设计数据库。原来生成出来的是英文内容,为了理解方便,我将英文添加了中文注释。)生成后的效果图如下:

    image

    该项目中有6个实体,其中专辑实体是整个案例中比较核心的部分。其它五个实体都是与它有关系的:

    1.艺术家出了哪些专辑("艺术家"1对多"专辑")

    2.专辑属于哪个流派("流派"一对多"专辑")

    3.购物车中有哪些专辑("专辑"一对多"购物车")

    4.订单中具体详情如何("订单"一对多"订单详情")

    5.专辑存在于哪个订单详情中。("专辑"一对多"订单详情")

    物理模型如下图所示:

    image

    看完之后心存疑问:

    1.购物车是否需要用这个Carts表来保存...(等看完代码后再回头看看是个怎么回事)

    购物车中的"购物车编号"怎么得来的?是否与用户有关系?

    我认为"专辑"与"订单"是有直接关系的,应该是多对多的映射关系.(一张专辑存在多个订单中,一个订单里面有多个专辑).多对多关系在生成物理模型的时候会自动创建一个中间表,这个中间表就是这两个实体通过多对多产生出来的主外键组成.由于该中间表只有主外键还不能很好的描述订单里面专辑的详细信息(数量、单价),所以在这个反向生成出来的关系图上面多了个中间实体对象"订单详情".如果在该图上直接描述"专辑"与"订单"两个实体之间的关系的话,则将来需要在生成出来的物理模型上面的中间表添加上两个字段(数量、单价).

    多对多的映射关系图可以建成如下所示:

    image

    生成出来的物理模型如下所示:

    image

    上图中就可以明显看出该中间表就少了两个字段(数量、单价),所以要自己加上.

    生成出来的SQL代码如下:

       1: /*==============================================================*/
       2: /* DBMS name:      Microsoft SQL Server 2008                    */
       3: /* Created on:     2011/2/25 16:29:13                           */
       4: /*==============================================================*/
       5:  
       6:  
       7: if exists (select 1
       8:             from  sysindexes
       9:            where  id    = object_id('Albums')
      10:             and   name  = 'FK_Album_Genre_FK'
      11:             and   indid > 0
      12:             and   indid < 255)
      13:    drop index Albums.FK_Album_Genre_FK
      14: go
      15:  
      16: if exists (select 1
      17:             from  sysindexes
      18:            where  id    = object_id('Albums')
      19:             and   name  = 'FK__Album__ArtistId__276EDEB3_FK'
      20:             and   indid > 0
      21:             and   indid < 255)
      22:    drop index Albums.FK__Album__ArtistId__276EDEB3_FK
      23: go
      24:  
      25: if exists (select 1
      26:             from  sysobjects
      27:            where  id = object_id('Albums')
      28:             and   type = 'U')
      29:    drop table Albums
      30: go
      31:  
      32: if exists (select 1
      33:             from  sysobjects
      34:            where  id = object_id('Artists')
      35:             and   type = 'U')
      36:    drop table Artists
      37: go
      38:  
      39: if exists (select 1
      40:             from  sysindexes
      41:            where  id    = object_id('Carts')
      42:             and   name  = 'FK_Cart_Album_FK'
      43:             and   indid > 0
      44:             and   indid < 255)
      45:    drop index Carts.FK_Cart_Album_FK
      46: go
      47:  
      48: if exists (select 1
      49:             from  sysobjects
      50:            where  id = object_id('Carts')
      51:             and   type = 'U')
      52:    drop table Carts
      53: go
      54:  
      55: if exists (select 1
      56:             from  sysobjects
      57:            where  id = object_id('Genres')
      58:             and   type = 'U')
      59:    drop table Genres
      60: go
      61:  
      62: if exists (select 1
      63:             from  sysindexes
      64:            where  id    = object_id('OrderDetails')
      65:             and   name  = 'FK_OrderDetail_Album_FK'
      66:             and   indid > 0
      67:             and   indid < 255)
      68:    drop index OrderDetails.FK_OrderDetail_Album_FK
      69: go
      70:  
      71: if exists (select 1
      72:             from  sysindexes
      73:            where  id    = object_id('OrderDetails')
      74:             and   name  = 'FK__InvoiceLi__Invoi__2F10007B_FK'
      75:             and   indid > 0
      76:             and   indid < 255)
      77:    drop index OrderDetails.FK__InvoiceLi__Invoi__2F10007B_FK
      78: go
      79:  
      80: if exists (select 1
      81:             from  sysobjects
      82:            where  id = object_id('OrderDetails')
      83:             and   type = 'U')
      84:    drop table OrderDetails
      85: go
      86:  
      87: if exists (select 1
      88:             from  sysobjects
      89:            where  id = object_id('Orders')
      90:             and   type = 'U')
      91:    drop table Orders
      92: go
      93:  
      94: /*==============================================================*/
      95: /* Table: Albums                                                */
      96: /*==============================================================*/
      97: create table Albums (
      98:    AlbumId              numeric              identity(1, 1),
      99:    ArtistId             numeric              not null,
     100:    GenreId              numeric              not null,
     101:    Title                nvarchar(160)        collate SQL_Latin1_General_CP1_CI_AS not null,
     102:    Price                numeric(10,2)        not null,
     103:    AlbumArtUrl          nvarchar(1024)       collate SQL_Latin1_General_CP1_CI_AS null constraint DF_Album_AlbumArtUrl default N'/Content/Images/placeholder.gif',
     104:    constraint PK_ALBUMS primary key nonclustered (AlbumId)
     105: )
     106: go
     107:  
     108: declare @CurrentUser sysname
     109: select @CurrentUser = user_name()
     110: execute sp_addextendedproperty 'MS_Description', 
     111:    '专辑编号',
     112:    'user', @CurrentUser, 'table', 'Albums', 'column', 'AlbumId'
     113: go
     114:  
     115: declare @CurrentUser sysname
     116: select @CurrentUser = user_name()
     117: execute sp_addextendedproperty 'MS_Description', 
     118:    '艺术家编号',
     119:    'user', @CurrentUser, 'table', 'Albums', 'column', 'ArtistId'
     120: go
     121:  
     122: declare @CurrentUser sysname
     123: select @CurrentUser = user_name()
     124: execute sp_addextendedproperty 'MS_Description', 
     125:    '流派编号',
     126:    'user', @CurrentUser, 'table', 'Albums', 'column', 'GenreId'
     127: go
     128:  
     129: declare @CurrentUser sysname
     130: select @CurrentUser = user_name()
     131: execute sp_addextendedproperty 'MS_Description', 
     132:    '标题',
     133:    'user', @CurrentUser, 'table', 'Albums', 'column', 'Title'
     134: go
     135:  
     136: declare @CurrentUser sysname
     137: select @CurrentUser = user_name()
     138: execute sp_addextendedproperty 'MS_Description', 
     139:    '价格',
     140:    'user', @CurrentUser, 'table', 'Albums', 'column', 'Price'
     141: go
     142:  
     143: declare @CurrentUser sysname
     144: select @CurrentUser = user_name()
     145: execute sp_addextendedproperty 'MS_Description', 
     146:    '专辑图片路径',
     147:    'user', @CurrentUser, 'table', 'Albums', 'column', 'AlbumArtUrl'
     148: go
     149:  
     150: /*==============================================================*/
     151: /* Index: FK__Album__ArtistId__276EDEB3_FK                      */
     152: /*==============================================================*/
     153: create index FK__Album__ArtistId__276EDEB3_FK on Albums (
     154: ArtistId ASC
     155: )
     156: go
     157:  
     158: /*==============================================================*/
     159: /* Index: FK_Album_Genre_FK                                     */
     160: /*==============================================================*/
     161: create index FK_Album_Genre_FK on Albums (
     162: GenreId ASC
     163: )
     164: go
     165:  
     166: /*==============================================================*/
     167: /* Table: Artists                                               */
     168: /*==============================================================*/
     169: create table Artists (
     170:    ArtistId             numeric              identity(1, 1),
     171:    Name                 nvarchar(120)        collate SQL_Latin1_General_CP1_CI_AS null,
     172:    constraint PK_ARTISTS primary key nonclustered (ArtistId)
     173: )
     174: go
     175:  
     176: declare @CurrentUser sysname
     177: select @CurrentUser = user_name()
     178: execute sp_addextendedproperty 'MS_Description', 
     179:    '艺术家编号',
     180:    'user', @CurrentUser, 'table', 'Artists', 'column', 'ArtistId'
     181: go
     182:  
     183: declare @CurrentUser sysname
     184: select @CurrentUser = user_name()
     185: execute sp_addextendedproperty 'MS_Description', 
     186:    '艺术家名称',
     187:    'user', @CurrentUser, 'table', 'Artists', 'column', 'Name'
     188: go
     189:  
     190: /*==============================================================*/
     191: /* Table: Carts                                                 */
     192: /*==============================================================*/
     193: create table Carts (
     194:    RecordId             numeric              identity(1, 1),
     195:    AlbumId              numeric              not null,
     196:    CartId               varchar(50)          collate SQL_Latin1_General_CP1_CI_AS not null,
     197:    Count                int                  not null,
     198:    DateCreated          datetime             not null,
     199:    constraint PK_CARTS primary key nonclustered (RecordId)
     200: )
     201: go
     202:  
     203: declare @CurrentUser sysname
     204: select @CurrentUser = user_name()
     205: execute sp_addextendedproperty 'MS_Description', 
     206:    '购物车实体',
     207:    'user', @CurrentUser, 'table', 'Carts'
     208: go
     209:  
     210: declare @CurrentUser sysname
     211: select @CurrentUser = user_name()
     212: execute sp_addextendedproperty 'MS_Description', 
     213:    '记录编号',
     214:    'user', @CurrentUser, 'table', 'Carts', 'column', 'RecordId'
     215: go
     216:  
     217: declare @CurrentUser sysname
     218: select @CurrentUser = user_name()
     219: execute sp_addextendedproperty 'MS_Description', 
     220:    '专辑编号',
     221:    'user', @CurrentUser, 'table', 'Carts', 'column', 'AlbumId'
     222: go
     223:  
     224: declare @CurrentUser sysname
     225: select @CurrentUser = user_name()
     226: execute sp_addextendedproperty 'MS_Description', 
     227:    '购物车编号',
     228:    'user', @CurrentUser, 'table', 'Carts', 'column', 'CartId'
     229: go
     230:  
     231: declare @CurrentUser sysname
     232: select @CurrentUser = user_name()
     233: execute sp_addextendedproperty 'MS_Description', 
     234:    '数量',
     235:    'user', @CurrentUser, 'table', 'Carts', 'column', 'Count'
     236: go
     237:  
     238: declare @CurrentUser sysname
     239: select @CurrentUser = user_name()
     240: execute sp_addextendedproperty 'MS_Description', 
     241:    '创建时间',
     242:    'user', @CurrentUser, 'table', 'Carts', 'column', 'DateCreated'
     243: go
     244:  
     245: /*==============================================================*/
     246: /* Index: FK_Cart_Album_FK                                      */
     247: /*==============================================================*/
     248: create index FK_Cart_Album_FK on Carts (
     249: AlbumId ASC
     250: )
     251: go
     252:  
     253: /*==============================================================*/
     254: /* Table: Genres                                                */
     255: /*==============================================================*/
     256: create table Genres (
     257:    GenreId              numeric              identity(1, 1),
     258:    Name                 nvarchar(120)        collate SQL_Latin1_General_CP1_CI_AS null,
     259:    Description          nvarchar(4000)       collate SQL_Latin1_General_CP1_CI_AS null,
     260:    constraint PK_GENRES primary key nonclustered (GenreId)
     261: )
     262: go
     263:  
     264: declare @CurrentUser sysname
     265: select @CurrentUser = user_name()
     266: execute sp_addextendedproperty 'MS_Description', 
     267:    '流派编号',
     268:    'user', @CurrentUser, 'table', 'Genres', 'column', 'GenreId'
     269: go
     270:  
     271: declare @CurrentUser sysname
     272: select @CurrentUser = user_name()
     273: execute sp_addextendedproperty 'MS_Description', 
     274:    '流派名称',
     275:    'user', @CurrentUser, 'table', 'Genres', 'column', 'Name'
     276: go
     277:  
     278: declare @CurrentUser sysname
     279: select @CurrentUser = user_name()
     280: execute sp_addextendedproperty 'MS_Description', 
     281:    '流派描述',
     282:    'user', @CurrentUser, 'table', 'Genres', 'column', 'Description'
     283: go
     284:  
     285: /*==============================================================*/
     286: /* Table: OrderDetails                                          */
     287: /*==============================================================*/
     288: create table OrderDetails (
     289:    OrderDetailId        numeric              identity(1, 1),
     290:    AlbumId              numeric              not null,
     291:    OrderId              numeric              not null,
     292:    Quantity             int                  not null,
     293:    UnitPrice            numeric(10,2)        not null,
     294:    constraint PK_ORDERDETAILS primary key nonclustered (OrderDetailId)
     295: )
     296: go
     297:  
     298: declare @CurrentUser sysname
     299: select @CurrentUser = user_name()
     300: execute sp_addextendedproperty 'MS_Description', 
     301:    '订单详情编号',
     302:    'user', @CurrentUser, 'table', 'OrderDetails', 'column', 'OrderDetailId'
     303: go
     304:  
     305: declare @CurrentUser sysname
     306: select @CurrentUser = user_name()
     307: execute sp_addextendedproperty 'MS_Description', 
     308:    '专辑编号',
     309:    'user', @CurrentUser, 'table', 'OrderDetails', 'column', 'AlbumId'
     310: go
     311:  
     312: declare @CurrentUser sysname
     313: select @CurrentUser = user_name()
     314: execute sp_addextendedproperty 'MS_Description', 
     315:    '订单编号',
     316:    'user', @CurrentUser, 'table', 'OrderDetails', 'column', 'OrderId'
     317: go
     318:  
     319: declare @CurrentUser sysname
     320: select @CurrentUser = user_name()
     321: execute sp_addextendedproperty 'MS_Description', 
     322:    '数量',
     323:    'user', @CurrentUser, 'table', 'OrderDetails', 'column', 'Quantity'
     324: go
     325:  
     326: declare @CurrentUser sysname
     327: select @CurrentUser = user_name()
     328: execute sp_addextendedproperty 'MS_Description', 
     329:    '单价',
     330:    'user', @CurrentUser, 'table', 'OrderDetails', 'column', 'UnitPrice'
     331: go
     332:  
     333: /*==============================================================*/
     334: /* Index: FK__InvoiceLi__Invoi__2F10007B_FK                     */
     335: /*==============================================================*/
     336: create index FK__InvoiceLi__Invoi__2F10007B_FK on OrderDetails (
     337: OrderId ASC
     338: )
     339: go
     340:  
     341: /*==============================================================*/
     342: /* Index: FK_OrderDetail_Album_FK                               */
     343: /*==============================================================*/
     344: create index FK_OrderDetail_Album_FK on OrderDetails (
     345: AlbumId ASC
     346: )
     347: go
     348:  
     349: /*==============================================================*/
     350: /* Table: Orders                                                */
     351: /*==============================================================*/
     352: create table Orders (
     353:    OrderId              numeric              identity(1, 1),
     354:    OrderDate            datetime             not null,
     355:    Username             nvarchar(256)        collate SQL_Latin1_General_CP1_CI_AS null,
     356:    FirstName            nvarchar(160)        collate SQL_Latin1_General_CP1_CI_AS null,
     357:    LastName             nvarchar(160)        collate SQL_Latin1_General_CP1_CI_AS null,
     358:    Address              nvarchar(70)         collate SQL_Latin1_General_CP1_CI_AS null,
     359:    City                 nvarchar(40)         collate SQL_Latin1_General_CP1_CI_AS null,
     360:    State                nvarchar(40)         collate SQL_Latin1_General_CP1_CI_AS null,
     361:    PostalCode           nvarchar(10)         collate SQL_Latin1_General_CP1_CI_AS null,
     362:    Country              nvarchar(40)         collate SQL_Latin1_General_CP1_CI_AS null,
     363:    Phone                nvarchar(24)         collate SQL_Latin1_General_CP1_CI_AS null,
     364:    Email                nvarchar(160)        collate SQL_Latin1_General_CP1_CI_AS null,
     365:    Total                numeric(10,2)        not null,
     366:    constraint PK_ORDERS primary key nonclustered (OrderId)
     367: )
     368: go
     369:  
     370: declare @CurrentUser sysname
     371: select @CurrentUser = user_name()
     372: execute sp_addextendedproperty 'MS_Description', 
     373:    '订单',
     374:    'user', @CurrentUser, 'table', 'Orders'
     375: go
     376:  
     377: declare @CurrentUser sysname
     378: select @CurrentUser = user_name()
     379: execute sp_addextendedproperty 'MS_Description', 
     380:    '订单编号',
     381:    'user', @CurrentUser, 'table', 'Orders', 'column', 'OrderId'
     382: go
     383:  
     384: declare @CurrentUser sysname
     385: select @CurrentUser = user_name()
     386: execute sp_addextendedproperty 'MS_Description', 
     387:    '订单日期',
     388:    'user', @CurrentUser, 'table', 'Orders', 'column', 'OrderDate'
     389: go
     390:  
     391: declare @CurrentUser sysname
     392: select @CurrentUser = user_name()
     393: execute sp_addextendedproperty 'MS_Description', 
     394:    '用户名',
     395:    'user', @CurrentUser, 'table', 'Orders', 'column', 'Username'
     396: go
     397:  
     398: declare @CurrentUser sysname
     399: select @CurrentUser = user_name()
     400: execute sp_addextendedproperty 'MS_Description', 
     401:    '名字',
     402:    'user', @CurrentUser, 'table', 'Orders', 'column', 'FirstName'
     403: go
     404:  
     405: declare @CurrentUser sysname
     406: select @CurrentUser = user_name()
     407: execute sp_addextendedproperty 'MS_Description', 
     408:    '姓氏',
     409:    'user', @CurrentUser, 'table', 'Orders', 'column', 'LastName'
     410: go
     411:  
     412: declare @CurrentUser sysname
     413: select @CurrentUser = user_name()
     414: execute sp_addextendedproperty 'MS_Description', 
     415:    '地址',
     416:    'user', @CurrentUser, 'table', 'Orders', 'column', 'Address'
     417: go
     418:  
     419: declare @CurrentUser sysname
     420: select @CurrentUser = user_name()
     421: execute sp_addextendedproperty 'MS_Description', 
     422:    '城市',
     423:    'user', @CurrentUser, 'table', 'Orders', 'column', 'City'
     424: go
     425:  
     426: declare @CurrentUser sysname
     427: select @CurrentUser = user_name()
     428: execute sp_addextendedproperty 'MS_Description', 
     429:    '省份/州',
     430:    'user', @CurrentUser, 'table', 'Orders', 'column', 'State'
     431: go
     432:  
     433: declare @CurrentUser sysname
     434: select @CurrentUser = user_name()
     435: execute sp_addextendedproperty 'MS_Description', 
     436:    '邮政编码',
     437:    'user', @CurrentUser, 'table', 'Orders', 'column', 'PostalCode'
     438: go
     439:  
     440: declare @CurrentUser sysname
     441: select @CurrentUser = user_name()
     442: execute sp_addextendedproperty 'MS_Description', 
     443:    '国家',
     444:    'user', @CurrentUser, 'table', 'Orders', 'column', 'Country'
     445: go
     446:  
     447: declare @CurrentUser sysname
     448: select @CurrentUser = user_name()
     449: execute sp_addextendedproperty 'MS_Description', 
     450:    '联系电话',
     451:    'user', @CurrentUser, 'table', 'Orders', 'column', 'Phone'
     452: go
     453:  
     454: declare @CurrentUser sysname
     455: select @CurrentUser = user_name()
     456: execute sp_addextendedproperty 'MS_Description', 
     457:    'Email/电子邮件',
     458:    'user', @CurrentUser, 'table', 'Orders', 'column', 'Email'
     459: go
     460:  
     461: declare @CurrentUser sysname
     462: select @CurrentUser = user_name()
     463: execute sp_addextendedproperty 'MS_Description', 
     464:    '总计',
     465:    'user', @CurrentUser, 'table', 'Orders', 'column', 'Total'
     466: go
     467:  
  • 相关阅读:
    HDU
    CodeForces
    CodeForces
    TensorFlow下利用MNIST训练模型并识别自己手写的数字
    李宏毅机器学习笔记2:Gradient Descent(附带详细的原理推导过程)
    李宏毅机器学习笔记1:Regression、Error
    tensorflow相关API的学习
    解决winscp中普通用户无法上传、删除、移动文件
    2019最新最全HUSTOJ本地及云端服务器搭建(基于腾讯云服务器)
    解决Ubuntu无法进行SSH连接的问题(以及如何使用SSH)
  • 原文地址:https://www.cnblogs.com/stevenhqq/p/1965138.html
Copyright © 2011-2022 走看看