2013-02-24 43 views
1

我已经完成了一些关于小型个人项目的php/mysql编程。不过,我正在开发我的第一个商业应用程序,该应用程序将允许客户或企业登录并执行CRUD操作。我觉得自己像一个总noob问这个问题,但我从来没有这样做过,无法在网上找到任何相关信息。如何为企业或客户群保留数据?

基本上,我创建了这个应用程序,并在我的数据库上设置了一个基于角色的系统。我遇到的问题是如何分离和获取相关业务或组的数据。

例如,我无法设置我的查询,如下所示:从示例表中获取所有记录,其中用户标识=用户标识,因为那样只会返回该用户的数据,而不是所有其他用户与该业务有关。我需要一种方法来获取由特定业务用户创建的所有记录。

我在想,也许业务应该有一个ID,我应该这样形成我的查询:从例如业务ID =业务ID获取所有记录。但我甚至不确定这是否是一个好方法。

是否有这种排序数据存储/读取和分组的最佳做法或惯例? 注意:安全性是一个很大的问题,因为我存储法律数据。

此外,我使用最新版本的laravel 4,如果这是任何相关性。

我想听听人们对此之前曾经遇到过这种问题的想法,以及他们如何设计数据库和查询以仅获取和存储与该特定业务相关的数据。

编辑:我喜欢阅读和学习,但无法找到关于此主题的任何有用信息 - 也许我没有使用正确的搜索词。所以,如果您知道有关此主题的任何良好链接,请将其发布。

+0

你在正确的道路上。创建一个持有企业的表格,然后将用户与这些业务关联起来。然后,每条数据都应该有一个带有要查询的商业ID的索引列。 – 2013-02-24 01:57:51

+0

@BenD我想这似乎是唯一合乎逻辑的方法。因此,对于与业务关联的每个表,我会创建一个链接到业务主键的外键?我想我回想一段时间以来,将多个相关表链接到表主键并不是一个好主意。 – Scott 2013-02-24 02:04:43

回答

2

如果我理解正确,在您的系统中将业务定义为“用户组”,并且整个系统引用属于用户的数据而不是属于业务的数据。您正在查找属于属于特定业务的所有用户的数据。在这种情况下,做到这一点的最佳且最具扩展性的方法是创建两个表来包含业务和业务用户关系。

例如,假设您有以下表格:

business   => Defines a business entity 
    id (primary) 
    name 

    Entry: id=4, name=CompanyCorp 

user    => Defines each user in the system 
    id (primary) 
    name 

    Entry: id=1, name=Geoff 
    Entry: id=2, name=Jane 

business_user => Links a user to a particular business 
    user_id (primary) 
    business_id (primary) 

    Entry: user_id=1, business_id=4 
    Entry: user_id=2, business_id=4 

基本上,business_user表定义的关系。例如,Geoff与CompanyCorp有关,因此该表中存在一行匹配id的行。这被称为关系数据库模型,并且是在数据库开发领域中理解的重要概念。你甚至可以允许一个用户属于多个不同的公司。

要查找所有用户自己所在的公司ID = 4 ......

SELECT `user`.`name` as `username`, `business`.`name` as `businessname` FROM `business_user` LEFT JOIN `user` ON (`user`.`id` = `business_user`.`user_id`) LEFT JOIN `business` ON (`business`.`id` = `business_user`.`business_id`) WHERE `business_user`.`business_id` = 4; 

结果将是名字和他们的公司名称,:

username businessname 
-> Geoff  CompanyCorp 
-> Jane  CompanyCorp 

我希望这有助于!

============================================== =================

根据您在回复中的回复“案件”的增编。

可以创建情况新表,然后引用在那里单独列的商务和用户ID,视情况将属于既是用户,又一个企业,如果这是你所需要的所有功能。

尽管如此,进一步探索关系数据库的想法,即您希望将多个用户分配给一个案例,但您希望将一个用户当选为“组长”,那么您可以按如下方式处理该问题:

  • 创建表“案例”来存储的情况下
  • 创建表“user_case”到店的情况下,用户的关系,就像在business_user表。

定义user_case表如下:

user_case    => Defines a user -> case relationship 
    user_id (primary) 
    case_id (primary) 
    role 

    Entry: user_id=1, case_id=1, role="leader" 
    Entry: user_id=2, case_id=1, role="subordinate" 

你甚至可以更进一步,在界定什么样的角色的用户可以承担与定义的表。然后,您甚至可以将user_case表更改为使用role_id,而是将来自另一个role表的数据连接起来。

这可能听起来像是一张非常小的表格的日益深化的模式,但请注意,我们已经为user_case关系表添加了一个额外的列。应用程序越大,您的桌子越多,横向增长的列越多。相信我,为了定义关系,你最终会停止添加新表格。

为了举例说明如何灵活这可能是一个简单的例子,用role表,你可以找出所有的角色给定用户(其中​​user_id = 6)具有通过使用相对较短的查询,如:

SELECT `role`.`name` FROM `role` RIGHT JOIN `user_case` ON (`user_case`.`role_id` = `role`.`id`) WHERE `user_case`.`user_id` = 6; 

如果您需要更多示例,请随时留言。

+0

这是有道理的。所以,参考这个例子,可以说我有另一个名为cases的表。创建案例时,我只需获取business_id和当前用户标识,然后使用该business_id和user_id保存案例。然后,当我想要获得并显示该业务的所有案例时,我只能说:获取所有业务id = business_id(当然是sudo代码)的情况。那是对的吗? – Scott 2013-02-24 02:29:08

+0

也许,这取决于你想要完成什么(我还没完全理解)。你能提供一个“案例”的定义吗? – 2013-02-24 02:31:51

+0

好的,如果你谈论的案例有点像“任务”(而不是公文包或什么),那么我已经用我希望能帮到你的一些新信息更新了我的答案。 – 2013-02-24 02:52:25