3种类型的用户拥有不同的数据

时间:2013-08-03 09:48:29

标签: mysql sql database-design

我正在开发一个我有多种类型用户的应用程序。他们都需要以下数据:

id | email | last_login

除了这些数据,每个数据都有一些特定类型的数据。例如,我有一个user类型的附加数据:

first_name | last_name

以及包含其他数据的shop类型:

shop_name | adress | phone | website

最后是一个类型供应商

supplier_name | adress | phone | category

我一直在尝试找到一个解决方案,我的第一个想法是创建一个表并且有一个额外的列extras和一个JSON数据列表 - 但这对于SQL排序来说是不好的。

我怎样才能以正确的方式做到这一点?

3 个答案:

答案 0 :(得分:0)

您可以定义一个抽象超类客户端,其中包含3个属性:

abstract class Client {
    int id;
    string email;
    date last_login;
}

然后你可以定义三个独立的孩子,每个孩子代表你所需要的一个类型。因此,如果您遵守面向对象的概念,这将毫无问题地得到解决。是自己使用ORM还是处理数据访问层?

答案 1 :(得分:0)

一种简单的方法是为包含必要列的每种类型创建一个表。此方法将复制每个表中的相同列,并包含不同的列。

所以你要创建三个表:

USER (id | email | last_login)
SHOP (id | email | last_login | shop_name | adress | phone | website)
SUPPLIER (id | email | last_login | supplier_name | adress | phone | category)

然后,无论使用何种语言,您都可以建立一个仅包含表中通用信息的对象。所以基本上只用id, email, last_login创建一个对象。如果您选择的语言支持继承,则可以扩展此基础对象以包括特定派生类的字段。

这称为Concrete Table Inheritance

有关数据库中继承建模的其他方法,请参阅此post

答案 2 :(得分:0)

您已经以适当的方式划分了数据。

User
----
User ID
Email
Last Login Timestamp


Person
------
User ID
Last Name
First Name


Shop
----
Shop ID
User ID
Website


Supplier
--------
Supplier ID
User ID
Supplier Name
Category ID


Category
--------
Category ID
Category Name


Address
-------
Address ID
Address


Phone
-----
Phone ID
Phone


ShopAddress
-----------
Shop ID
Address ID


ShopPhone
---------
Shop ID
Phone ID


SupplierAddress
---------------
Supplier ID
Address ID


SupplierPhone
-------------
Supplier ID
Phone ID

商店和供应商可以拥有多个地址和多个电话号码。