【问题标题】:How to keep data separate for businesses or groups of customers?如何为企业或客户群体保持数据分离?
【发布时间】:2013-02-09 11:10:39
【问题描述】:

我已经放弃了在小型个人项目中使用 php/mysql 进行的一些编程。但是,我正在开发我的第一个商业应用程序,该应用程序将允许客户或企业登录并执行 CRUD 操作。我觉得自己像个菜鸟一样问这个问题,但我以前从来没有这样做过,也无法在网上找到任何相关信息。

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

例如,我不能像这样设置我的查询:从 user id = user id 的示例表中获取所有记录,因为这只会返回该用户的数据,而不是所有其他相关用户的数据到那个企业。我需要一种方法来获取由特定企业的用户创建的所有记录。

我在想,也许企业应该有一个 id,我应该像这样形成我的查询:从示例 where business id = business id 获取所有记录。但我什至不确定这是否是一个好方法。

这种数据存储/获取和分组是否有最佳实践或约定? 注意:这里的安全性是一个大问题,因为我存储的是合法数据。

另外,如果有任何相关性,我正在使用最新版本的 laravel 4。

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

编辑:我喜欢阅读和学习,但找不到关于这个主题的任何有用信息——也许我没有使用正确的搜索词。因此,如果您知道与此主题相关的任何好的链接,请也发布它们。

【问题讨论】:

  • 您走在正确的道路上。创建一个包含企业的表,然后将用户与这些企业相关联。然后,每条数据都应该有一个索引列,其中包含要查询的企业 ID。
  • @BenD 我想这似乎是唯一合乎逻辑的方法。因此,对于与业务关联的每个表,我会创建一个链接到业务主键的外键?我想我记得前一阵子读到,将多个相关表链接到表主键并不是一个好主意。

标签: php mysql laravel


【解决方案1】:

如果我理解正确,企业在您的系统中被定义为“用户组”,您的整个系统引用属于用户的数据,而不是属于企业的数据。您正在寻找属于属于特定企业的所有用户的参考数据。在这种情况下,最好和最可扩展的方法是再创建两个表来包含业务和业务-用户关系。

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

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

我希望这会有所帮助!

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

根据您在 cmets 中的回复,关于“案例”的附录。

您可以为案例创建一个新表,然后在其中的不同列上引用企业和用户 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;

如果您需要更多示例,请随时发表评论。

【讨论】:

  • 这是有道理的。所以,参考这个例子,假设我有另一个名为 case 的表。创建案例时,我只需获取 business_id 和当前用户 ID,并使用该 business_id 和 user_id 保存案例。然后,当我想获取并显示该业务的所有案例时,我可以说:获取业务 id = business_id(当然是 sudo 代码)的所有案例。对吗?
  • 也许,这取决于你想要完成什么(我还不完全理解)。你能给出什么是“案例”的定义吗?
  • 好的,如果您说的案例有点像“任务”(而不是公文包或其他东西),那么我已经用一些新信息更新了我的答案,希望对您有所帮助。
  • 当然,案件只是代表法律案件的表格。案例表将包含案例名称、客户名称、保险理算员等字段。因此,数据库中将有几个由用户创建的案例,这些用户与企业相关联,或者更具体地说,与法律相关联公司。这有意义吗?
  • 听起来你走上了正轨,那么!使用 WHERE user_id = x and business_id = y 听起来很适合您的目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多