1

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

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

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

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

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

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

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

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

4

1 回答 1

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 和用户 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来找出给定用户(where)具有的所有角色,例如: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;

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

于 2013-02-24T02:14:04.197 回答