我一直在使用python进行一些简单的Web编程,并且我对生成和提供网页所涉及的大多数部分有基本的了解。但是,我对使用关系数据库作为存储和检索数据的方式只有很少的把握。我确实理解SQL查询和数据库设计的基础知识,但是我很难理解我应该做什么以允许并发访问(以及其他内容)。
考虑到这一点,我有几个相当具体的问题。但是,对于每个问题,我只对问题本身的答案部分感兴趣。我最感兴趣的是我是否以正确的方式提出这些问题。所以这就是:
我喜欢这些具体问题的任何评论,或者指向描述在网络上使用关系数据库的正确思考方式的任何资源的指针。
答案 0 :(得分:3)
您的许多问题都会被DBMS抽象出来。您通常不需要强调线程/并发相关的东西。您可以做的是将事务中的插入/更新/查询分组,以使它们更具原子性并确保全部或全部发生。例如,如果这些事务受到部分干扰,则可以回滚此类事务。
您没有提到您使用的数据库,但这里有一个与数据库无关的小型交易介绍。当然,您还应该查看数据库的官方文档。
http://www.sqlteam.com/article/introduction-to-transactions
就“什么东西不属于数据库”而言,图像和大块文本都很好。您可以存储二进制blob,如果它对您正在做的事情有意义,您可以存储代码。我建议的一件事是你考虑将数据直接存储在数据库中,或者存储服务器上文件的路径/文件名是否符合你的利益。
答案 1 :(得分:1)
我应该做什么来允许并发访问
您让数据库处理它,它就是它的设计目标。
- 使用关系数据库时,如何确保多个线程在写入数据库时不会相互干扰?
数据库将处理此问题。有时这意味着其中一个查询将中止以避免死锁。您需要在代码中检测到这一点。
- 是否有多个线程访问数据库会导致他们正在读取的数据不同步?
是的,这是可能的。您无能为力 - 这是多线程读/写相同数据的结果。您可以使用同步命令,但这些命令可能会影响性能。
- 我应该如何管理从数据库读/写的权限?
通过数据库安全机制,无论它们是什么。
- 是否存在不属于数据库的内容(图像,大块文本)?
大文件,但即使这取决于应用程序。将应用程序数据存储在数据库中。
答案 2 :(得分:0)
我不会直接将数据库暴露给网络;我在客户端和数据库之间有一个中间层来处理诸如身份验证和授权,验证和绑定,数据库访问的同步和隔离等事情。
这可以让我通过添加更多中间层硬件来扩展。