好吧,有趣的是,为什么要使用 3NF?
在 MVC Web 框架(如 Codeigniter、Zend Framework 或 Ruby on Rails)中,您不需要 3NF,甚至不需要关心不同的表。我想说的是,您正在尝试的是多表继承,这不是很常见。
所以实际上你有一个Custumer
类,它具有你的 Customer、User 和 Person 表的所有属性。要坚持 MVC 和瘦控制器方法,您的类中有一个save
动作,CustomerController
它接受这些属性并从此类实例化一个对象Costumer
:
class CostumerController {
function create() {
Costumer c = new Customer();
c.save($_POST['costumer']);
}
}
(确保您检查 SQL 注入的参数,但您的框架应该以某种方式处理它。)
您的自定义类应该有一个构造函数,它应该接受其所有属性并将它们保存到适当的表中。IE:
class Costumer {
function save(params) {
$sql = 'INSERT INTO person SET `phoneNumber` = "' . params['phonenumber'] . '"';
$dbh->query($sql);
$lastid = PDO::lastInsertId;
$sql = 'INSERT INTO user SET `password` = "'. md5(params['password']) . '", `personId` = "' . $lastid . '";
...
}
}
您可能已经注意到,由于我不了解 CodeIgniter,因此我缩短了 Sql 语句和一些代码。但是这个想法是将您需要的所有数据提供给 save 方法,该方法将其保存到数据库中的适当表中。
记住:只有模型类与 MVC 中的数据库通信。
问题是您在其他表中用作外键的 ID。因此,在将数据插入到人员之后,您需要在表中查询它刚刚插入的 ID,并在另一个表中使用它。
这就是为什么一些框架(可以这么说:我所知道的)默认使用单表继承。把它想象成这样:
您描述它的方式,您的Costumer
继承自User
which 继承自Person
. 所有这些表都合并到一个表中,该表还包含一个type
属性,该属性表示该行的对象是哪种类型,在我们的例子中是Customer
:User
或Person
。如果只添加一个用户,所有未使用的属性都将设置为NULL
。但这当然会破坏你的 3NF。
不过,我不明白为什么你总是需要 1:1 的关系。例如Person
和之间Company
。哦,现在我明白了,既然没有companyId (FK)
in Person
,很多Person
s 可以在一个中Company
。但是为什么Branch
会有一个personId (FK)
. 通常有更多的人在一个分支机构工作,不是吗?
回到你的问题
您可以使用Thin-controller-fat-model或fat-controller-thin-model,但我更喜欢第一个。在这种情况下,您的控制器中只有几行代码,模型中有更多逻辑(如我上面的示例所示)。与数据库的通信仅发生在您的模型类中。您通常没有一个表等于一个模型类型的方法,但您也可能有多个模型类型访问一个表(请参阅单表继承)。
另一种方法
您可以有一个Costumer
模型来接受您的数据并以表格“分散”的方式对其进行“分组”:
class Customer {
function save(params) {
Person $person = new Person();
$person.save(params['person']);
User $user = new User();
$user.save(params['user'], $person->id);
....
}
}
但是...好吧,正如我所说,我建议您离开 3NF 方法并使用 STI(单表继承)。
不要忘记确保引用表单数据以避免 SQL 注入或查看您的框架提供哪些功能来为您执行此操作。
对不起,代码中的任何错误,我只是从内存中“编码”,甚至没有语法解析它。
高温高压