在开发购物车应用程序时,我发现我需要根据管理员的偏好和要求保存设置和配置.此信息可以是公司信息,运输帐户ID,PayPal API密钥,通知首选项等.
创建一个表来在关系数据库系统中存储单行似乎非常不合适.
存储此信息的适当方法是什么?
注意:我的DBMS是SQL Server 2008,编程层是用ASP.NET实现的(在C#中).
我正在开始一个新项目,并希望从一开始就获得我的表名和列名.例如,我总是在表名中使用复数,但最近学到的单数是正确的.
那么,如果我得到一个表"用户"然后我得到的产品只有用户会有,那么这个表应该命名为"user_product"还是只是"product"?这是一对多的关系.
进一步说,如果我(由于某种原因)每个产品的几个产品描述,它会是"user_product_description"或"product_description"还是只是"描述"?当然有正确的外键设置..命名它只描述会有问题,因为我也可以有用户说明或帐户描述或其他..
如果我想要一个只有两列的纯关系表(多对多),那会是什么样子呢?"user_stuff"或者类似"rel_user_stuff"的内容?如果是第一个,可以区分它,例如"user_product"?
任何帮助都非常感谢,如果有你们推荐的某种命名约定标准,请随时链接.
谢谢
database database-design coding-style naming-conventions relational-database
在多个课程,书籍和工作中,我看到将文本字段定义为VARCHAR(255)作为"短"文本的默认类型.有没有什么好的理由经常选择长度为255,而不是一个漂亮的圆数?在有充分理由(无论今天是否适用)的情况下,过去的某个时间是坚持吗?
当然,我意识到,如果你以某种方式知道字符串的最大长度,那么更严格的限制会更理想.但是如果你使用VARCHAR(255)可能表示你不知道最大长度,那只是它是一个"短"字符串.
注意:我发现这个问题(VARCHAR(255)V TINYBLOB v TINYTEXT),它表示,VARCHAR(Ñ)需要Ñ 1个字节的存储空间用于Ñ <= 255,Ñ 2个字节的存储对的Ñ > 255.这是唯一的原因吗?这似乎有点武断,因为与VARCHAR(256)相比,你只能保存两个字节,你可以通过声明VARCHAR(253)轻松地保存另外两个字节.
我的要求是:
其他信息:
选项:
使用StringValue1,StringValue2创建一个大表... IntValue1,IntValue2,...等我讨厌这个想法,但如果有人能告诉我它比其他想法更好,为什么会考虑它.
创建一个动态表,根据需要按需添加新列.我也不喜欢这个想法,因为除非你索引每一列,否则我觉得性能会很慢.
创建一个包含UDFName,UDFDataType和Value的表.添加新的UDF时,生成一个View,它只提取该数据并将其解析为指定的任何类型.不符合解析标准的项返回NULL.
创建多个UDF表,每种数据类型一个.所以我们有UDFStrings,UDFDates等的表.可能和#2一样,并且只要添加新字段就自动生成View
XML数据类型?我之前没有使用过这些,但已经看过它们了.不确定他们是否会给我我想要的结果,尤其是性能.
别的什么?
是否有可视化预先存在的数据库模式的好工具?如果重要的话,我正在使用MySQL.
我目前正在使用MySQL Workbench来处理SQL创建脚本转储,但是它很笨拙,很慢并且是一个手动过程来拖动所有表(如果它不是那么慢就没关系).
软删除是个好主意还是坏主意?
您只需将其标记为IsDeleted = true,而不是实际删除数据库中的记录,并且在恢复记录后,您可以将其标记为False.
这是一个好主意吗?
最好是物理删除记录,然后将其移动到存档数据库,如果用户想要记录回来,那么软件会在存档中查找记录并重新创建它吗?
在对我的一个问题发表评论之后,我在想是否更好地使用带有X架构的1个数据库,反之亦然.
我的情况:我正在开发一个网络应用程序,当人们注册时,我创建(实际上)数据库(不,它不是社交网络:每个人都必须能够访问自己的数据,永远不会看到其他用户的数据).
这就是我用于我的应用程序的先前版本(仍然在mysql上运行)的方式:通过plesk api,对于每次注册,我这样做:
现在,我需要对postgresql做同样的事情(项目越来越成熟,mysql ......不能满足所有需求)
我需要使所有数据库/模式备份独立:pg_dump在两种方式下都能很好地工作,对于可以配置为仅访问1个模式或1个数据库的用户来说是相同的.
所以,假设你是比我更有经验的potgres用户,你认为对我的情况最好的解决方案是什么,为什么?
使用$ x db而不是$ x schemas会有性能差异吗?什么解决方案将来会更好地维护(可靠性)?
编辑:我差点忘了:我所有的数据库/模式将始终具有相同的结构!
Edit2:对于备份问题(使用pg_dump),使用1 db和多个模式可能更好,一次性转储所有模式:恢复将非常简单地在dev机器中加载主转储然后转储和恢复所需的模式:还有1个额外的步骤,但是倾倒所有架构似乎更快,然后逐个转储它们.
ps:对不起,如果我在文本中忘记了一些'W'字符,我的键盘会受到该按钮的影响;)
那么,应用程序的结构和设计在过去的两年中发生了很大变化.我仍在使用这种one db with many schemas方法,但是,我的应用程序的每个版本都有1个数据库:
Db myapp_01
\_ my_customer_foo_schema
\_ my_customer_bar_schema
Db myapp_02
\_ my_customer_foo_schema
\_ my_customer_bar_schema
Run Code Online (Sandbox Code Playgroud)
对于备份,我定期转储每个数据库,然后在开发服务器上移动备份.
我也使用PITR/WAL备份,但正如我之前所说,它不太可能我必须立即恢复所有数据库 ..所以它可能会被解雇今年(在我的情况下不是最好的方法).
从现在开始,1-db-many-schema方法对我来说非常有效,即使应用程序结构完全改变了:
我差点忘了:我所有的数据库/模式将始终具有相同的结构!
...现在,每个模式都有自己的结构,可以改变对用户数据流的反应.
我在我的网站上实现了一个类似于stackoverflow使用的标记系统,我的问题是 - 什么是存储标记的最有效方法,以便可以搜索和过滤它们?
我的想法是这样的:
Table: Items
Columns: Item_ID, Title, Content
Table: Tags
Columns: Title, Item_ID
Run Code Online (Sandbox Code Playgroud)
这太慢了吗?有没有更好的办法?
我一直想知道Facebook如何设计朋友< - >用户关系.
我认为用户表是这样的:
user_email PK
user_id PK
password
Run Code Online (Sandbox Code Playgroud)
我用用户的数据(性别,年龄等通过用户电子邮件连接,我会假设)来计算表格.
它是如何将所有朋友连接到此用户的?
像这样的东西?
user_id
friend_id_1
friend_id_2
friend_id_3
friend_id_N
Run Code Online (Sandbox Code Playgroud)
可能不是.因为用户数量未知并且将会扩展.
sql database-design facebook database-normalization database-table
您是否了解如何设计SQL解决方案?
除了基本的语言语法,我正在寻找帮助我理解的东西:
database-design ×10
database ×8
sql ×5
coding-style ×1
facebook ×1
mysql ×1
postgresql ×1
scalability ×1
schema ×1
soft-delete ×1
tagging ×1
tags ×1
types ×1
varchar ×1