有这样一个需求:
有m个用户公用n个文件,一个用户可能会用到多个文件,一个文件可能被多个用户使用;
如果某个用户离开,那这个用户就不再使用任何文件;如果某个文件没有任何用户使用,就要删除该文件;
已知某个用户正在使用某些文件,要求管理这个用户离开的时候,到底要不要删除他原来使用的文件。
 
这个问题对搞服务器开发的人来说可能就是几十分钟或者几分钟的事儿,但这对我一个iOS开发者来说,可就没那么容易了。
想了半天搞不定,最后还是向搞服务器的朋友们请教才弄出了个解决方案。。。
我只能说,数据库这么强大,不补一下不行啊~~
 
简单记录下解决方案:
用数据库建3张表搞定。
一张用户表:记录userId userName
一张文件表:记录fileId filePath
一张用户-文件关系表:记录用户跟文件的对应关系 userId-fileId
其中关系表是个m对n的关系表
 
用户表和文件表都是直接增删查改就行;
关系表要注意下:当某个用户使用某个文件的时候,在关系表中插入一条 userId-fileId的数据,当这个用户不再使用这个文件的时候,删除这条数据
所以关系表的内容大概是
userId     fileId
1               1
1               2
1               3
1               4
2               1
2               4
。。。
。。。
 
如果要查userId为i某个用户用到了多少文件,只需要查关系表中所有userId=i就可以了;
如果要查fileId为j的某个文件被多少用户使用,只需要查关系表中所有fileId=j的就可以了;
那么当userId为i某个用户要离开的时候,他用到的那些文件应不应该删除呢?
那就需要以下几个步骤:
1,查询出这个用户用到了哪些文件,将文件fileId缓存起来
2,删除关系表中所有userId=i的数据
3,遍历缓存起来的fileId,再次查询关系表,查询该文件还被多少人使用;
如果这时候使用的人数为0,那说明该文件已经没用户使用了,可以删除,
如果使用人数不为0,则说明该文件还有其他用户使用,不能删除。
搞定~~~
 
逻辑搞定了,剩下的就是敲代码
iOS上用SQLite,FMDB貌似是最好用的了吧~FMDB的文档写的也很不错
我用FMDB把上面的逻辑写了个demo,放在这里https://github.com/Phelthas/Demo_FileManagerWithFMDB 
有什么问题,欢迎讨论~~
(如果觉得不错,别忘了点个star) 

简单的数据库设计及使用(FMDB)的更多相关文章

  1. SQL 修改字段类型和长度,常见类型介绍及数据库设计工具PowerDesigner和astah

    1.电话字段设置24个Byte竟然不够,好吧设置为50的长度. alter table <表名> alter column <字段名> 新类型名(长度) 举例: ) 2.删除一 ...

  2. 仿联想商城laravel实战---1、仿联想商城需求和数据库设计(lavarel如何搭建项目)

    仿联想商城laravel实战---1.仿联想商城需求和数据库设计(lavarel如何搭建项目) 一.总结 一句话总结: composer引入lavarel.配置域名.配置apache 1.项目名 le ...

  3. NetCore微服务简单流程审批数据库设计及后台服务开发

    1.数据库设计 -- ---------------------------- -- Table structure for TBase_Flow -- ----------------------- ...

  4. 数据库设计中的Soft Delete模式

    最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...

  5. 使用django开发博客过程记录1——数据库设计

    1.数据库设计 2.插入测试数据 3.配置相关问题 1.数据库设计 数据库有简单的三张表:Article.Category.Tag以下是代码 # -*- coding:utf-8 -*- from _ ...

  6. 优化MySchool数据库设计之【巅峰对决】

    优化MySchool数据库设计 之独孤九剑 船舶停靠在港湾是很安全的,但这不是造船的目的 By:北大青鸟五道口原玉明老师 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识 ...

  7. 从零开始编写自己的C#框架(9)——数据库设计与创建

    对于千万级与百万级数据库设计是有所区别的,由于本项目是基于中小型软件开发框架来设计,记录量相对会比较少,所以数据库设计时考虑的角度是:与开发相结合:空间换性能:空间换开发效率:减少null异常.... ...

  8. 数据库设计(1/9):数据元(Data Elements)

    对于设计和创建数据库完全是个新手?没关系,Joe Celko,世界上读者数量最多的SQL作者之一,会告诉你这些基础.和往常一样,即使是最专业的数据库老手,也会给他们带来惊喜.Joe是DMBS杂志是多年 ...

  9. 数据库设计范式1——三范式

    一讲到数据库设计,大家很容易想到的就是三范式,但是第四.第五范式又是什么,不是很清楚,三范式到底怎么区分,也不清楚,作为数据库设计的基础概念,我再讲解下数据库范式.   Normal form Bri ...

随机推荐

  1. 录像时调用MediaRecorder的start()时发生start failed: -19错误

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  2. nuget常用命令

    nuget命令的用法: 一.安装 1.安装指定版本类库install-package <程序包名> -version <版本号> 2.安装到指定的项目install-packa ...

  3. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  4. 自己开发实现OAuth做webapi认证

    看到园子里面有人写的OAuth,就想把自己实现的OAuth也分享一下,关于OAuth协议这里就不再赘述. 一.作为认证服务器,首先需要提供一个可以通过appid/appsecret来获取token这样 ...

  5. 用java开发微信公众号:接收和被动回复普通消息(三)

    上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复.说到普通消息,那么什么是微信公众号所定义的普通消息呢,微信开发者文档中提到的接收的普通消息包括如下几类: 1.文本 ...

  6. Java回调方法详解

    回调在维基百科中定义为: 在计算机程序设计中,回调函数,是指通过函数参数传递到其他代码的,某一块可执行代码的引用. 其目的是允许底层代码调用在高层定义的子程序. 举个例子可能更明白一些:以Androi ...

  7. 4.修改更新源sources.list,提高软件下载安装速度(提供Kali 2.0 更新源)

    1.切换到root用户(如果已经是root用户就直接看第二步) dnt@HackerKali:~$ su 密码: 2.用文本编辑器打开sources.list,手动添加下面的更新源 root@Hack ...

  8. 07.GitHub实战系列~7.Git之VS2013团队开发(如果不想了解git命令直接学这篇即可)

    GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...

  9. memcached安装及.NET中的Memcached.ClientLibrary使用详解

    序言 吹吹牛逼先,借我你的20分钟,保证你在.net中使用memcached缓存数据,畅通无阻,提升数据读取效率,分担数据库压力,便不在话下. 本篇主要说下:memcached分布式缓存的负载均衡配置 ...

  10. Android ButterKnife配置使用

    ButterKnife在GitHub的地址:https://github.com/JakeWharton/butterknife 最新的版本是:8.4.0 app 模块的build.gradle: a ...