4

Webベースのソーシャルネットワークタイプのアプリケーションを設計/設計/開発する必要があります。

基本機能:
-ユーザーはシステム上でアカウントを作成します
-ユーザーはお互いに「友達」になることに同意します-ユーザーは
システム内でコンテンツを作成します
-ユーザーは自分が作成したコンテンツを表示/編集できる友達を指定します

確かに、このコア機能は以前に何度も作成されていますか?この種のものを実装する方法について、そこにベストプラクティスのパターンはありますか?

このためのデータベースがどのように見えるかに最も興味があります。

これはSQLの観点(任意のデータベース)からどのように見えますか?
これは、NOSQLの観点(任意のNOSQLデータベース)からどのように見えるでしょうか?

私が最も興味を持っているのは、データベース内で「コンテンツの可視性」の問題をどのように解決するかということです。つまり、データベース/アプリケーションは、承認された友人だけがユーザーが作成したコンテンツを見ることができるようにするにはどうすればよいですか?

ありがとう

4

7 に答える 7

2

あなたのデザインはメンテナンス可能でなければなりません。これが私のプロジェクトにあるものです。

1.)Application.Infrastructure

  • すべてのビジネスオブジェクトの基本クラス、ビジネスオブジェクトコレクション、データアクセスクラス、および拡張メソッドとしてのカスタム属性とユーティリティ、ジェネリック検証フレームワーク。これにより、最終的な.netアプリケーションの全体的な動作構成が決まります。

2.)Application.DataModel

  • データベースの型付きデータセット。
  • TableAdaptersは、トランザクションやその他の必要な機能を組み込むために拡張されました。

3.)Application.DataAccess

  • データアクセスクラス。
  • 基になる型付きデータセットを使用してデータベースアクションが照会される実際の場所。

4.)Application.DomainObjects

  • ビジネスオブジェクトとビジネスオブジェクトコレクション。
  • 列挙型。

5.)Application.BusinessLayer

  • プレゼンテーション層からアクセス可能なマネージャークラスを提供します。
  • HttpHandlers。
  • 私自身のPage基本クラス。
  • もっと多くのものがここに行きます。

6.)Application.WebClientまたはApplication.WindowsClient

  • 私のプレゼンテーション層
  • Application.BusinessLayerおよびApplication.BusinessObjectsから参照を取得します。

Application.BusinessObjectsはアプリケーション全体で使用され、必要に応じてすべてのレイヤーを移動します[Application.DataModelとApplication.Infrastructureを除く]

私のクエリはすべて、Application.DataModelのみで定義されています。

Application.DataAccessは、データアクセス操作の一部としてBusinessオブジェクトを返すか受け取ります。ビジネスオブジェクトは、リフレクション属性を使用して作成されます。各ビジネスオブジェクトは、データベース内のターゲットテーブルへの属性マッピングでマークされ、ビジネスオブジェクト内のプロパティは、それぞれのデータベーステーブル内のターゲット列への属性マッピングでマークされます。

私の検証フレームワークでは、指定されたValidationAttributeを使用して各フィールドを検証できます。

私のフレームワークは、属性を多用して、マッピングや検証などの面倒なタスクのほとんどを自動化します。フレームワークの新機能として新機能を追加することもできます。

サンプルのビジネスオブジェクトは、私のアプリケーションでは次のようになります。

User.cs

[TableMapping("Users")]
public class User : EntityBase
{
    #region Constructor(s)
    public AppUser()
    {
        BookCollection = new BookCollection();
    }
    #endregion

    #region Properties

    #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute

    private System.Int32 _UserId;

    private System.String _FirstName;
    private System.String _LastName;
    private System.String _UserName;
    private System.Boolean _IsActive;

    [DataFieldMapping("UserID")]
    [DataObjectFieldAttribute(true, true, false)]
    [NotNullOrEmpty(Message = "UserID From Users Table Is Required.")]
    public override int Id
    {
        get
        {
            return _UserId;
        }
        set
        {
            _UserId = value;
        }
    }

    [DataFieldMapping("UserName")]
    [Searchable]
    [NotNullOrEmpty(Message = "Username Is Required.")]
    public string UserName
    {
        get
        {
            return _UserName;
        }
        set
        {
            _UserName = value;
        }
    }

    [DataFieldMapping("FirstName")]
    [Searchable]
    public string FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            _FirstName = value;
        }
    }

    [DataFieldMapping("LastName")]
    [Searchable]
    public string LastName
    {
        get
        {
            return _LastName;
        }
        set
        {
            _LastName = value;
        }
    }

    [DataFieldMapping("IsActive")]
    public bool IsActive
    {
        get
        {
            return _IsActive;
        }
        set
        {
            _IsActive = value;
        }
    }

    #region One-To-Many Mappings
    public BookCollection Books { get; set; }

    #endregion

    #region Derived Properties
    public string FullName { get { return this.FirstName + " " + this.LastName; } }

    #endregion

    #endregion

    public override bool Validate()
    {
        bool baseValid = base.Validate();
        bool localValid = Books.Validate();
        return baseValid && localValid;
    }
}

BookCollection.cs

/// <summary>
/// The BookCollection class is designed to work with lists of instances of Book.
/// </summary>
public class BookCollection : EntityCollectionBase<Book>
{
    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection()
    {
    }

    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection (IList<Book> initialList)
        : base(initialList)
    {
    }
}
于 2009-12-28T10:34:57.813 に答える
2

まず、データベースについて説明します。SQL データベースは、正規化された SQL データベースのように見えます。それは他にどのように見えるでしょうか?nosql データベースは、一連の名前と値のペア ファイルのように見えます。

ソーシャル Web サイトを構築するための 3 つのアプローチは、既存の人気のあるサイトと人気のないサイトについて大量の調査を行って、それらのアーキテクチャとターゲットとする市場、およびこれらの市場に提供する特定のサービスを確認した後にのみ行われます。

  1. ゼロから自分で作成します (またはフレームワークを使用します)。Facebook、Beebo、Myspace などのように。これは明らかにそこに到達するための最長のルートですが、そうするときに何かを売ることができることを意味します. プラットフォームとメンバーシップと USP の両方を、ルパート マードックまたは誰にでも販売することができます。
  2. ソーシャル サイトに適した CMS を使用し、基本機能、プラグイン、および独自のインスピレーションを使用して、ターゲット市場に参入します。この分野では Drupal がよく使われます (私もうまく使いました) が、Joomla、Xaraya、その他多くの無料および有料のツールを使用できます。ええ、もっと研究してください。ベースツールはおそらくGPLであるため、Rupertがあなたにベルを与えた場合、ここで販売するものは少なくなります
  3. 提供されているシステムの 1 つを使用してサインアップし、ツールを使用して独自のシステムを構築しますが、すべての特典が提供されます。これらはホワイト ラベル サイトとして知られています。ここから探し始めてください。ここでは、誰かがあなたを乗っ取りたいと思っても、売り込むことはほとんどありません.

「コンテンツの可視性」の処理方法。もちろん、最初はサイト ビルダーが、誰がコンテンツを表示できるかを決定します。オーナーのみ、友達、登録ユーザー、一般?など。ただし、この決定は、サイトの目的とポリシーに適合する必要があります。これを処理する最善の方法は、役割ベースのアクセス RBACを使用することです。詳細については、こちらを参照してください。

あなたが「設計/設計/開発する必要がある」と言うとき、それは圧倒的な内的衝動のためですか、それとも誰かがあなたにお金を払っているからですか?

いずれにせよ、ソーシャル Web スペースは非常に混雑していることを思い出してください。別の YouTube や FaceBook を構築している場合、そのようなサイトを商業的に成功させるために必要なクリティカル マスを生成できる可能性は低いでしょう。

「The Peckham and Brockley Exotic Bird Fanciers Club」など、まだ対応していないニッチ市場向けの場合は、市場が何であり、どのような機能が必要になるかを知っているので、最も簡単で安価と思われる上記のオプションを選択できます。使用されますが、それを分析して実行するのはあなた次第です。

もちろん、主流であり、他のソーシャル サイトではカバーされていないソーシャル サイトのアイデアを持っている場合もあります。つまり、神話上の「市場のギャップ」を発見した場合などです。この場合、それに行きますが、がっかりする準備をしてください。か否か。

于 2009-12-28T09:38:18.990 に答える
2

http://www.neo4j.orgのようなグラフ データベースを参照することをお勧めします。ソーシャル ネットワーク (例: http://blog.neo4j.org/2009/09/social-networks-in-database-using-graph.html ) と ACL ベースのセキュリティ (例: http: //wiki.neo4j.org/content/ACL )。

于 2009-12-28T19:07:35.920 に答える
0

まず、既存のソーシャルネットワーク(Facebook、Myspaceなど)を調べる必要があります。それらがどのように実装されているかについては、かなりの量の情報が利用可能です。

于 2009-12-28T08:57:00.867 に答える
0

ソーシャルネットワークの成功の鍵は、それが基づいているテクノロジーではなく、ユーザーのために解決する問題です。ユーザーがそれを気に入った場合、たとえあなたの技術がくだらなくても、あなたは成功する運命にあります。

[編集]どのように実装されていますか?SQLベースのユーザーロールシステムを確認してください。この場合、すべてのユーザーは、任意のオブジェクトへの「アクセスを許可」として追加できるロールでもあります。オブジェクトの数とコントロールの粒度に応じて、3つの列を持つテーブルがあることを意味します。OBJECT, USER, ACCESS_TYPEここACCESS_TYPEOWNERREAD(friend)、WRITE(close friend)のいずれかになります。

このテーブルはかなり大きくなりますが、今日のデータベースでは数億行が珍しくありません。

于 2009-12-28T09:03:24.443 に答える
0

最終的には、Elgg または Dolphin が私たちの要件を満たす可能性があるようです。これらは、独自のソーシャル ネットワークを展開するための PHP フレームワークのようです。Facebook プラットフォームを見ましたが、それが何であるかを明確に説明しているものはどこにもありませんでした。Facebook コードのように見えますが、おそらくアドオン API などのコードにすぎません。

于 2010-01-06T22:29:33.553 に答える
0

アーロンが指摘したように、まず、解決したい問題は何かを自問する必要があります。

人々に共有してもらいたいコンテンツは何ですか? 本当に友達だけに見えるようにするべきですか?コンテンツを一般に公開すると、表示されるコンテンツは誰がページを見ているかに依存せず、簡単にキャッシュできるため、はるかに簡単でスケーラブルです。公開されているユーザー生成コンテンツは、新しいユーザーを引き付けます。

アクセスを制限し、友人のグループをリソースに関連付ける機会をユーザーに与えたい場合は、単純なグループベースのアクセス制御を使用します。各リソースに、リソースを編集できるユーザーのグループと、リソースを表示できるユーザーのグループを持たせます。

このようにして、各リソースには 2 つの単一値属性があり、各ユーザーは有限数のグループに所属します。view-group および edit-group 属性を、NOSQL データベース、Lucene/Sphinx などの検索エンジン、または SQL データベースの行に格納されたドキュメントに添付できます。ユーザーが利用できるコンテンツを照会するときは、ユーザーが属するすべてのグループを渡します (SQLINでは、Sphinx で句を使用しsetFilter('view-group', array(2,3,4))ます。データベースは、ユーザーが利用できるコンテンツのみを返します。2 つの整数値のみをアタッチしているため (view-groupおよび edit-group) をドキュメントに保存すると、それらをメモリに保存できるため、検索が高速でスケーラブルになります。

于 2009-12-28T19:27:02.420 に答える