我希望允许我的用户存储他们的电子邮件列表,我正在使用MySQL。
我想让用户决定他们的电子邮件列表可能包含哪些字段。例如。姓名,电子邮件,位置,生日
每个用户可能想要不同的字段,每个列表可能彼此具有不同的字段。
我真的很困惑我应该如何构建我的数据库来实现这一点。任何帮助将不胜感激。
答案 0 :(得分:1)
由于字段数和字段类型可能未知,并且可能会因用户而异,因此将它们硬编码为列可能没有意义。相反,我建议你在这里使用键值对方法。首先定义一个表email_fields
,如下所示:
user_id | id | field
1 | 1 | Name
1 | 2 | Email
1 | 3 | Location
1 | 4 | Birthday
以上用户1已将其电子邮件列表配置为包含四个字段,这些字段是您在问题中提供的示例。为此用户添加更多字段或添加更多用户,只意味着向此表添加更多记录,而不更改实际列。
然后,在另一个表email_lists
中,您将存储电子邮件地址和用户的实际元数据:
id | user_id | field_id | value
1 | 1 | 1 | Sam Plan
1 | 1 | 2 | sam.plan@somewhere.com
1 | 1 | 3 | Gonesville, AL
1 | 1 | 4 | 1967-03-28
换句话说,基本思想是每个用户的每封电子邮件都会代表一组与一堆键值对相对应的记录。
答案 1 :(得分:0)
我希望允许我的用户存储他们的电子邮件列表,我正在使用MySQL。
这意味着给定用户可能有多个电子邮件列表。
因此,用于存储电子邮件列表的相应表应如下所示:
+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| user_id | int(10) unsigned | NO | | NULL | |
| title | varchar(255) | NO | | NULL | |
+---------+------------------+------+-----+---------+----------------+
每个用户可能想要不同的字段,每个列表可能彼此具有不同的字段。
字段将是文本或数字。用户可以创建自己的字段
+---------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| email_list_id | int(10) unsigned | NO | | NULL | |
| field | varchar(255) | NO | | NULL | |
| value | longtext | YES | | NULL | |
+---------------+------------------+------+-----+---------+----------------+
以下是创建这些表的SQL查询:
CREATE TABLE `email_list` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `email_list_data` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`email_list_id` int unsigned NOT NULL,
`field` varchar(255) NOT NULL,
`value` longtext DEFAULT NULL,
PRIMARY KEY (`id`)
);
在另一种方法中,您将使用另一个表来存储字段,另一个用于存储值。
CREATE TABLE `email_list` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `email_list_fields` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`email_list_id` int unsigned NOT NULL,
`field` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `email_list_field_values` (
`email_list_id` int unsigned NOT NULL,
`field_id` int unsigned NOT NULL,
`field_value` longtext DEFAULT ''
);
答案 2 :(得分:0)
其他答案会删除元数据。这很好,虽然它不适用于基于“记录”的大量数据或关系,因为没有联系模型。如果为列表中的联系人指定了30个字段,则会返回30条记录。
实施起来需要2个部分,但最终会更加结构化。
有一些教程可以帮助解决这个问题。从本质上讲,您将拥有一个存储团队的主数据库等。然后,您的每个团队都将获得自己的数据库。我们有一个实现这种结构的项目,效果很好。您可以同时连接到主租户数据库和特定租户数据库。
我以前从未做过这部分,但我认为这是可能的..
尝试制作灵活的架构文件构建器。您可以通过PHP执行系统命令,将生成的文件保存到团队中的结构目录中,例如Option Explicit
Const FOLDER_PATH = "C:\Users\OneDrive\Projects\Audit Sheet\" 'REMEMBER END BACKSLASH
Sub ImportWorksheets()
'=============================================
'Process all Excel files in specified folder
'=============================================
Dim sFile As String 'file to process
Dim wsTarget As Worksheet
Dim wbSource As Workbook
Dim wsSource As Worksheet
Dim rowTarget As Long 'output row
rowTarget = 2
'check the folder exists
If Not FileFolderExists(FOLDER_PATH) Then
MsgBox "Specified folder does not exist, exiting!"
Exit Sub
End If
'reset application settings in event of error
On Error GoTo errHandler
Application.ScreenUpdating = False
'loop through the Excel files in the folder
sFile = Dir(FOLDER_PATH & "*.xls*")
Do Until sFile = ""
'open the source file and set the source worksheet - ASSUMED WORKSHEET(1)
Set wbSource = Workbooks.Open(FOLDER_PATH & sFile)
'Set wsSource = wbSource.Worksheets(1) 'EDIT IF NECESSARY
'import the data
'close the source workbook, increment the output row and get the next file
wbSource.Close SaveChanges:=False
'rowTarget = rowTarget + 1
sFile = Dir()
Loop
errHandler:
On Error Resume Next
Application.ScreenUpdating = True
'tidy up
Set wsSource = Nothing
Set wbSource = Nothing
Set wsTarget = Nothing
End Sub
Private Function FileFolderExists(strPath As String) As Boolean
If Not Dir(strPath, vbDirectory) = vbNullString Then FileFolderExists = True
End Function
或类似的东西。
然后,您可以针对该特定租户数据库(使用Artisan :: run()门户帮助程序)在该特定文件上运行artisan migration命令。你的每个团队都可以拥有他们想要的任何结构,就像你为他们建造了一样。
这一切都可以在同一份工作中执行。