【问题标题】:Store database, good pattern for simultaneous access存储数据库,同时访问的好模式
【发布时间】:2010-03-13 13:00:06
【问题描述】:

我对数据库设计有点陌生,所以我请求一些建议或某种好的模式。

情况是,只有一个数据库,表少,用户多。如果用户可以同时与数据库交互,我应该如何设计数据库,或/以及我应该使用哪些类型的查询来使其工作?我的意思是,他们可以访问并且可以更改同一组数据。

我在考虑交易,但我不确定这是否是正确/好的/唯一的解决方案。

更新:

我的意思是数百,甚至数千。客户端将通过 PHP 中的 WWW 页面连接到 MySQL。他们将使用以下操作:插入、更新、删除和选择,有时甚至加入。这是一个小型数据库,可容纳 5-20 个客户和 1-2 个管理员。客户将更新和选择信息。我正在考虑在 $_SESSION 中存储一些信息的交易。

【问题讨论】:

  • 请提供有关您的问题的更多信息。 “许多”是多少(一次 10、100、1000)?他们将直接连接到 mySQL 服务器,还是您将使用 Web 服务器来提供他们的信息?您的用户会主要从您的数据库服务器中检索信息吗?他们会经常更新吗?来自数据库的最大检索量是否仅适用于一张表,或者它们是否需要表连接。最大量的更新是否只更新一个表,还是需要多个表更新事务。
  • 嘿奥利,我在主帖中添加了一些信息。

标签: php mysql sql


【解决方案1】:

一种非常有效的简单方法是行版本控制。

  • 在主表中添加一个版本 int 字段,
  • 插入时设置为0
  • 更新时加一;在应该是版本字段的地方

示例:

CREATE TABLE myTable (
id INT NOT NULL,
name VARCHAR(50) NOT NULL,
vs INT NOT NULL,
)

INSERT INTO myTable VALUES (1, 'Sebastian', 0)

-- first user reads, vs = 0
SELECT * FROM myTable WHERE id = 1

-- second user reads, vs = 0
SELECT * FROM myTable WHERE id = 1

-- first user writes, vs = 1
UPDATE myTable SET name = 'Juan Sebastian', vs = vs + 1 WHERE id = 1 AND vs = 0
(1 row affected) 

-- second user writes, no rows affected, because vs is different, show error to the user or do your logic
UPDATE myTable SET name = 'Julian', vs = vs + 1 WHERE id = 1 AND vs = 0
(0 rows affected) 

【讨论】:

【解决方案2】:
  1. 使用 InnoDB 作为引擎类型。与 MyISAM 相反,它支持行级阻塞,因此当有人更新某些记录时,您不必阻塞整个表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2013-08-10
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    相关资源
    最近更新 更多